├── .gitignore ├── .travis.yml ├── LICENSE ├── NOTICE ├── README.md ├── app-conf ├── AggregatorConf.xml ├── AutoTuningConf.xml ├── FetcherConf.xml ├── GeneralConf.xml ├── HeuristicConf.xml ├── JobTypeConf.xml ├── SchedulerConf.xml └── elephant.conf ├── app ├── Global.java ├── com │ └── linkedin │ │ └── drelephant │ │ ├── AutoTuner.java │ │ ├── DrElephant.java │ │ ├── ElephantContext.java │ │ ├── ElephantRunner.java │ │ ├── analysis │ │ ├── AnalyticJob.java │ │ ├── AnalyticJobGenerator.java │ │ ├── AnalyticJobGeneratorHadoop2.java │ │ ├── ApplicationType.java │ │ ├── ElephantBackfillFetcher.java │ │ ├── ElephantFetcher.java │ │ ├── HDFSContext.java │ │ ├── HadoopAggregatedData.java │ │ ├── HadoopApplicationData.java │ │ ├── HadoopMetricsAggregator.java │ │ ├── HadoopSystemContext.java │ │ ├── Heuristic.java │ │ ├── HeuristicResult.java │ │ ├── HeuristicResultDetails.java │ │ ├── JobType.java │ │ ├── Metrics.java │ │ ├── Severity.java │ │ └── SeverityThresholds.scala │ │ ├── clients │ │ ├── WorkflowClient.java │ │ └── azkaban │ │ │ ├── AzkabanJobStatusUtil.java │ │ │ └── AzkabanWorkflowClient.java │ │ ├── configurations │ │ ├── aggregator │ │ │ ├── AggregatorConfiguration.java │ │ │ └── AggregatorConfigurationData.java │ │ ├── fetcher │ │ │ ├── FetcherConfiguration.java │ │ │ └── FetcherConfigurationData.java │ │ ├── heuristic │ │ │ ├── HeuristicConfiguration.java │ │ │ └── HeuristicConfigurationData.java │ │ ├── jobtype │ │ │ └── JobTypeConfiguration.java │ │ └── scheduler │ │ │ ├── SchedulerConfiguration.java │ │ │ └── SchedulerConfigurationData.java │ │ ├── exceptions │ │ ├── EventException.java │ │ ├── ExceptionFinder.java │ │ ├── HadoopException.java │ │ ├── JobState.java │ │ ├── LoggingEvent.java │ │ ├── MRClient.java │ │ ├── MRJobLogAnalyzer.java │ │ ├── MRTaskLogAnalyzer.java │ │ ├── StackTraceFrame.java │ │ └── azkaban │ │ │ └── AzkabanJobLogAnalyzer.java │ │ ├── mapreduce │ │ ├── MapReduceMetricsAggregator.java │ │ ├── TaskLevelAggregatedMetrics.java │ │ ├── data │ │ │ ├── MapReduceApplicationData.java │ │ │ ├── MapReduceCounterData.java │ │ │ └── MapReduceTaskData.java │ │ ├── fetchers │ │ │ ├── MapReduceFSFetcherHadoop2.java │ │ │ ├── MapReduceFetcher.java │ │ │ └── MapReduceFetcherHadoop2.java │ │ └── heuristics │ │ │ ├── CommonConstantsHeuristic.java │ │ │ ├── DistributedCacheLimitHeuristic.java │ │ │ ├── ExceptionHeuristic.java │ │ │ ├── GenericGCHeuristic.java │ │ │ ├── GenericMemoryHeuristic.java │ │ │ ├── GenericSkewHeuristic.java │ │ │ ├── JobQueueLimitHeuristic.java │ │ │ ├── MapperGCHeuristic.java │ │ │ ├── MapperMemoryHeuristic.java │ │ │ ├── MapperSkewHeuristic.java │ │ │ ├── MapperSpeedHeuristic.java │ │ │ ├── MapperSpillHeuristic.java │ │ │ ├── MapperTimeHeuristic.java │ │ │ ├── ReducerGCHeuristic.java │ │ │ ├── ReducerMemoryHeuristic.java │ │ │ ├── ReducerSkewHeuristic.java │ │ │ ├── ReducerTimeHeuristic.java │ │ │ └── ShuffleSortHeuristic.java │ │ ├── math │ │ └── Statistics.java │ │ ├── metrics │ │ └── CustomGarbageCollectorMetricSet.java │ │ ├── priorityexecutor │ │ ├── Priority.java │ │ ├── PriorityBasedThreadPoolExecutor.java │ │ └── RunnableWithPriority.java │ │ ├── schedulers │ │ ├── AirflowScheduler.java │ │ ├── AzkabanScheduler.java │ │ ├── NoScheduler.java │ │ ├── OozieScheduler.java │ │ ├── PinballScheduler.java │ │ └── Scheduler.java │ │ ├── security │ │ └── HadoopSecurity.java │ │ ├── spark │ │ ├── SparkMetricsAggregator.scala │ │ ├── data │ │ │ ├── SparkApplicationData.scala │ │ │ ├── SparkLogDerivedData.scala │ │ │ └── SparkRestDerivedData.scala │ │ ├── fetchers │ │ │ ├── FSFetcher.scala │ │ │ ├── SparkFetcher.scala │ │ │ ├── SparkLogClient.scala │ │ │ ├── SparkRestClient.scala │ │ │ └── statusapiv1 │ │ │ │ ├── StageStatus.java │ │ │ │ └── statusapiv1.scala │ │ ├── heuristics │ │ │ ├── ConfigurationHeuristic.scala │ │ │ ├── ExecutorGcHeuristic.scala │ │ │ ├── ExecutorsHeuristic.scala │ │ │ ├── JobsHeuristic.scala │ │ │ └── StagesHeuristic.scala │ │ └── legacydata │ │ │ ├── LegacyDataConverters.scala │ │ │ ├── SparkApplicationData.java │ │ │ ├── SparkEnvironmentData.java │ │ │ ├── SparkExecutorData.java │ │ │ ├── SparkGeneralData.java │ │ │ ├── SparkJobProgressData.java │ │ │ └── SparkStorageData.java │ │ ├── tez │ │ ├── TezMetricsAggregator.java │ │ ├── TezTaskLevelAggregatedMetrics.java │ │ ├── data │ │ │ ├── TezApplicationData.java │ │ │ ├── TezCounterData.java │ │ │ └── TezTaskData.java │ │ ├── fetchers │ │ │ └── TezFetcher.java │ │ └── heuristics │ │ │ ├── GenericDataSkewHeuristic.java │ │ │ ├── GenericGCHeuristic.java │ │ │ ├── GenericMemoryHeuristic.java │ │ │ ├── MapperDataSkewHeuristic.java │ │ │ ├── MapperGCHeuristic.java │ │ │ ├── MapperMemoryHeuristic.java │ │ │ ├── MapperSpeedHeuristic.java │ │ │ ├── MapperSpillHeuristic.java │ │ │ ├── MapperTimeHeuristic.java │ │ │ ├── ReducerDataSkewHeuristic.java │ │ │ ├── ReducerGCHeuristic.java │ │ │ ├── ReducerMemoryHeuristic.java │ │ │ ├── ReducerTimeHeuristic.java │ │ │ ├── TezScopeDataSkewHeuristic.java │ │ │ ├── TezScopeGCHeuristic.java │ │ │ ├── TezScopeMemoryHeuristic.java │ │ │ ├── TezScopeSpeedHeuristic.java │ │ │ └── TezScopeTimeHeuristic.java │ │ ├── tony │ │ ├── TonyMetricsAggregator.java │ │ ├── data │ │ │ ├── TonyApplicationData.java │ │ │ └── TonyTaskData.java │ │ ├── fetchers │ │ │ └── TonyFetcher.java │ │ ├── heuristics │ │ │ ├── TaskGPUHeuristic.java │ │ │ └── TaskMemoryHeuristic.java │ │ └── util │ │ │ └── TonyUtils.java │ │ ├── tuning │ │ ├── AutoTuningAPIHelper.java │ │ ├── AzkabanJobCompleteDetector.java │ │ ├── BaselineComputeUtil.java │ │ ├── FitnessComputeUtil.java │ │ ├── JobCompleteDetector.java │ │ ├── JobTuningInfo.java │ │ ├── PSOParamGenerator.java │ │ ├── ParamGenerator.java │ │ ├── Particle.java │ │ └── TuningInput.java │ │ └── util │ │ ├── HadoopUtils.scala │ │ ├── InfoExtractor.java │ │ ├── MemoryFormatUtils.java │ │ ├── SparkUtils.scala │ │ ├── ThreadContextMR2.java │ │ ├── Utils.java │ │ └── YarnURLUtils.java ├── controllers │ ├── Application.java │ ├── AutoTuningMetricsController.java │ ├── ControllerUtil.java │ ├── IdUrlPair.java │ ├── MetricsController.java │ ├── PaginationStats.java │ └── api │ │ └── v1 │ │ ├── .Web.java.swp │ │ ├── JsonKeys.java │ │ └── Web.java ├── models │ ├── AppHeuristicResult.java │ ├── AppHeuristicResultDetails.java │ ├── AppResult.java │ ├── BackfillInfo.java │ ├── FlowDefinition.java │ ├── FlowExecution.java │ ├── JobDefinition.java │ ├── JobExecution.java │ ├── JobSavedState.java │ ├── JobSuggestedParamSet.java │ ├── JobSuggestedParamValue.java │ ├── TuningAlgorithm.java │ ├── TuningJobDefinition.java │ ├── TuningJobExecutionParamSet.java │ └── TuningParameter.java ├── org │ └── apache │ │ └── spark │ │ ├── deploy │ │ └── history │ │ │ ├── SparkDataCollection.scala │ │ │ └── SparkFSFetcher.scala │ │ └── storage │ │ └── StorageStatusTrackingListener.scala └── views │ ├── help │ ├── helpNoData.scala.html │ ├── mapreduce │ │ ├── helpDistributedCacheLimit.scala.html │ │ ├── helpException.scala.html │ │ ├── helpGC.scala.html │ │ ├── helpJobQueueLimit.scala.html │ │ ├── helpMapperMemory.scala.html │ │ ├── helpMapperSkew.scala.html │ │ ├── helpMapperSpeed.scala.html │ │ ├── helpMapperSpill.scala.html │ │ ├── helpMapperTime.scala.html │ │ ├── helpMemory.scala.html │ │ ├── helpReducerMemory.scala.html │ │ ├── helpReducerSkew.scala.html │ │ ├── helpReducerTime.scala.html │ │ └── helpShuffleSort.scala.html │ ├── metrics │ │ ├── helpRuntime.scala.html │ │ ├── helpUsedResources.scala.html │ │ ├── helpWaittime.scala.html │ │ └── helpWastedResources.scala.html │ ├── spark │ │ ├── helpBestProperties.scala.html │ │ ├── helpConfigurationHeuristic.scala.html │ │ ├── helpEventLogLimit.scala.html │ │ ├── helpExecutorGcHeuristic.scala.html │ │ ├── helpExecutorLoad.scala.html │ │ ├── helpExecutorsHeuristic.scala.html │ │ ├── helpJobRuntime.scala.html │ │ ├── helpJobsHeuristic.scala.html │ │ ├── helpMemoryLimit.scala.html │ │ ├── helpStageRuntime.scala.html │ │ └── helpStagesHeuristic.scala.html │ ├── tez │ │ ├── helpGC.scala.html │ │ ├── helpMapperDataSkew.scala.html │ │ ├── helpMapperSpeed.scala.html │ │ ├── helpMapperSpill.scala.html │ │ ├── helpMapperTime.scala.html │ │ ├── helpMemory.scala.html │ │ ├── helpReducerDataSkew.scala.html │ │ ├── helpReducerTime.scala.html │ │ ├── helpScopeTaskDataSkew.scala.html │ │ ├── helpScopeTaskTime.scala.html │ │ └── helpShuffleSort.scala.html │ └── tony │ │ ├── helpTaskGPU.scala.html │ │ └── helpTaskMemory.scala.html │ ├── index.scala.html │ ├── main.scala.html │ ├── newmain.scala.html │ ├── page │ ├── comparePage.scala.html │ ├── flowHistoryPage.scala.html │ ├── helpPage.scala.html │ ├── homePage.scala.html │ ├── jobHistoryPage.scala.html │ ├── oldFlowHistoryPage.scala.html │ ├── oldHelpPage.scala.html │ ├── oldJobHistoryPage.scala.html │ └── searchPage.scala.html │ ├── results │ ├── compareResults.scala.html │ ├── flowDefinitionIdDetails.scala.html │ ├── flowDetails.scala.html │ ├── flowHistoryResults.scala.html │ ├── flowMetricsHistoryResults.scala.html │ ├── jobDetails.scala.html │ ├── jobHistoryResults.scala.html │ ├── jobMetricsHistoryResults.scala.html │ ├── oldFlowHistoryResults.scala.html │ ├── oldFlowMetricsHistoryResults.scala.html │ ├── oldJobHistoryResults.scala.html │ ├── oldJobMetricsHistoryResults.scala.html │ └── searchResults.scala.html │ └── tags │ ├── aggregatedMetrics.scala.html │ ├── column.scala.html │ ├── jobHeader.scala.html │ ├── jobSummary.scala.html │ ├── pagination.scala.html │ ├── panel.scala.html │ └── searchPanel.scala.html ├── baseline.conf ├── build.sbt ├── checkstyle.sbt ├── common.sh ├── compile.conf ├── compile.sh ├── conf ├── application.conf ├── evolutions │ └── default │ │ ├── 1.sql │ │ ├── 2.sql │ │ ├── 3.sql │ │ ├── 4.sql │ │ ├── 5.sql │ │ └── 6.sql ├── log4j.properties └── routes ├── cpd.sbt ├── findbugs.sbt ├── images └── wiki │ ├── compare-page.png │ ├── critical.png │ ├── dashboard.png │ ├── dr-elephant-logo-150x150.png │ ├── dr-elephant-logo-300x300.png │ ├── flow-history.png │ ├── flowhistorymetrics.png │ ├── job-history.png │ ├── jobdetails.png │ ├── jobhistorymetrics.png │ ├── low.png │ ├── moderate.png │ ├── none.png │ ├── search.png │ ├── severe.png │ └── suggestions.png ├── jacoco.sbt ├── project ├── Dependencies.scala ├── build.properties ├── checkstyle-config.xml ├── checkstyle-java.header ├── checkstyle-noframes-severity-sorted-modified.xsl ├── checkstyle-suppressions.xml ├── findbugs-exclude-filters.xml ├── plugins.sbt ├── scalastyle-config.xml └── scalastyle_xml_to_html.py ├── public ├── assets │ ├── analytics │ │ └── track.js │ ├── bootstrap-datepicker │ │ ├── css │ │ │ └── datepicker.css │ │ └── js │ │ │ └── bootstrap-datepicker.js │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ └── bootstrap.min.css │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ └── js │ │ │ ├── bootstrap.js │ │ │ └── bootstrap.min.js │ ├── d3 │ │ ├── d3.js │ │ └── d3.min.js │ └── jquery │ │ ├── jquery-1.9.0.min.js │ │ └── jquery.deserialize.min.js ├── css │ ├── application.css │ └── main.css ├── images │ ├── favicon.png │ ├── loading.gif │ ├── logo.png │ ├── runtime.png │ ├── usedmemory.png │ ├── waittime.png │ └── wastedmemory.png └── js │ ├── flowhistoryform.js │ ├── flowresourcehistoryform.js │ ├── flowtimehistoryform.js │ ├── graphresourcesmetricsutility.js │ ├── graphtimemetricsutility.js │ ├── graphutility.js │ ├── jobhistoryform.js │ ├── jobresourcesmetricshistoryform.js │ ├── jobtimehistoryform.js │ ├── resourcegraphtooltiputility.js │ ├── searchform.js │ ├── searchpanel.js │ └── timegraphtooltiputility.js ├── resolver.conf.template ├── scalastyle.sbt ├── scripts ├── pso │ ├── pso_param_generation.py │ └── restartable_pso.py ├── start.sh └── stop.sh ├── test ├── com │ └── linkedin │ │ └── drelephant │ │ ├── BackfillTest.java │ │ ├── analysis │ │ ├── AnalyticJobGeneratorHadoop2Test.java │ │ ├── AnalyticJobTest.java │ │ ├── SeverityTest.java │ │ └── SeverityThresholdsTest.scala │ │ ├── configurations │ │ ├── fetcher │ │ │ └── FetcherConfigurationTest.java │ │ ├── heuristic │ │ │ └── HeuristicConfigurationTest.java │ │ ├── jobtype │ │ │ └── JobTypeConfigurationTest.java │ │ └── scheduler │ │ │ └── SchedulerConfigurationTest.java │ │ ├── exceptions │ │ ├── EventExceptionTest.java │ │ ├── MRJobLogAnalyzerTest.java │ │ └── azkaban │ │ │ └── AzkabanJobLogAnalyzerTest.java │ │ ├── mapreduce │ │ ├── TestTaskLevelAggregatedMetrics.java │ │ ├── fetchers │ │ │ ├── MapReduceFSFetcherHadoop2Test.java │ │ │ └── MapReduceFetcherHadoop2Test.java │ │ └── heuristics │ │ │ ├── DistributedCacheLimitHeuristicTest.java │ │ │ ├── JobQueueLimitHeuristicTest.java │ │ │ ├── MapperGCHeuristicTest.java │ │ │ ├── MapperMemoryHeuristicTest.java │ │ │ ├── MapperSkewHeuristicTest.java │ │ │ ├── MapperSpeedHeuristicTest.java │ │ │ ├── MapperSpillHeuristicTest.java │ │ │ ├── MapperTimeHeuristicTest.java │ │ │ ├── ReducerGCHeuristicTest.java │ │ │ ├── ReducerMemoryHeuristicTest.java │ │ │ ├── ReducerSkewHeuristicTest.java │ │ │ ├── ReducerTimeHeuristicTest.java │ │ │ └── ShuffleSortHeuristicTest.java │ │ ├── math │ │ └── StatisticsTest.java │ │ ├── priorityexecutor │ │ └── PriorityBasedThreadPoolExecutorTest.java │ │ ├── schedulers │ │ ├── AirflowSchedulerTest.java │ │ ├── AzkabanSchedulerTest.java │ │ ├── OozieSchedulerTest.java │ │ └── PinballSchedulerTest.java │ │ ├── spark │ │ ├── SparkMetricsAggregatorTest.scala │ │ ├── data │ │ │ └── SparkApplicationDataTest.scala │ │ ├── fetchers │ │ │ ├── SparkFetcherTest.scala │ │ │ ├── SparkLogClientTest.scala │ │ │ └── SparkRestClientTest.scala │ │ ├── heuristics │ │ │ ├── ConfigurationHeuristicTest.scala │ │ │ ├── ExecutorGcHeuristicTest.scala │ │ │ ├── ExecutorsHeuristicTest.scala │ │ │ ├── JobsHeuristicTest.scala │ │ │ └── StagesHeuristicTest.scala │ │ └── legacydata │ │ │ ├── LegacyDataConvertersTest.scala │ │ │ └── MockSparkApplicationData.java │ │ ├── tez │ │ ├── TezTaskLevelAggregatedMetricsTest.java │ │ ├── fetchers │ │ │ └── TezFetcherTest.java │ │ └── heuristics │ │ │ ├── MapperDataSkewHeuristicTest.java │ │ │ ├── MapperGCHeuristicTest.java │ │ │ ├── MapperMemoryHeuristicTest.java │ │ │ ├── MapperSpeedHeuristicTest.java │ │ │ ├── MapperSpillHeuristicTest.java │ │ │ ├── MapperTimeHeuristicTest.java │ │ │ ├── ReducerDataSkewHeuristicTest.java │ │ │ ├── ReducerGCHeuristicTest.java │ │ │ ├── ReducerMemoryHeuristicTest.java │ │ │ └── ReducerTimeHeuristicTest.java │ │ ├── tony │ │ ├── TonyMetricsAggregatorTest.java │ │ ├── fetchers │ │ │ └── TonyFetcherTest.java │ │ ├── heuristics │ │ │ └── TaskMemoryHeuristicTest.java │ │ └── util │ │ │ └── TonyUtilsTest.java │ │ ├── tuning │ │ └── PSOParamGeneratorTest.java │ │ └── util │ │ ├── HadoopUtilsTest.scala │ │ ├── InfoExtractorTest.java │ │ ├── MemoryFormatUtilsTest.java │ │ ├── SparkUtilsTest.scala │ │ └── UtilsTest.java ├── common │ ├── DBTestUtil.java │ ├── TestConstants.java │ └── TestUtil.java ├── controllers │ ├── ApplicationTest.java │ └── MetricsControllerTest.java ├── org │ └── apache │ │ └── spark │ │ └── deploy │ │ └── history │ │ ├── SparkDataCollectionTest.java │ │ └── SparkFsFetcherTest.scala ├── resources │ ├── AggregatorConf.xml │ ├── AutoTuningConf.xml │ ├── FetcherConf.xml │ ├── GeneralConf.xml │ ├── HeuristicConf.xml │ ├── JobTypeConf.xml │ ├── SchedulerConf.xml │ ├── configurations │ │ ├── fetcher │ │ │ ├── FetcherConfTest1.xml │ │ │ ├── FetcherConfTest10.xml │ │ │ ├── FetcherConfTest11.xml │ │ │ ├── FetcherConfTest2.xml │ │ │ ├── FetcherConfTest3.xml │ │ │ ├── FetcherConfTest4.xml │ │ │ ├── FetcherConfTest5.xml │ │ │ ├── FetcherConfTest6.xml │ │ │ ├── FetcherConfTest7.xml │ │ │ ├── FetcherConfTest8.xml │ │ │ └── FetcherConfTest9.xml │ │ ├── heuristic │ │ │ ├── HeuristicConfTest1.xml │ │ │ ├── HeuristicConfTest2.xml │ │ │ ├── HeuristicConfTest3.xml │ │ │ ├── HeuristicConfTest4.xml │ │ │ └── HeuristicConfTest5.xml │ │ ├── jobtype │ │ │ ├── JobTypeConfTest1.xml │ │ │ ├── JobTypeConfTest2.xml │ │ │ ├── JobTypeConfTest3.xml │ │ │ ├── JobTypeConfTest4.xml │ │ │ ├── JobTypeConfTest5.xml │ │ │ └── JobTypeConfTest6.xml │ │ └── scheduler │ │ │ ├── SchedulerConfTest1.xml │ │ │ ├── SchedulerConfTest2.xml │ │ │ └── SchedulerConfTest3.xml │ ├── core-site.xml │ ├── elephant.conf │ ├── history │ │ ├── done │ │ │ └── 2018 │ │ │ │ └── 05 │ │ │ │ └── 17 │ │ │ │ └── 000000 │ │ │ │ ├── job_1526555215992_0001-1526555642677-user-QuasiMonteCarlo-1526555658299-1-1-SUCCEEDED-default-1526555648931.jhist │ │ │ │ ├── job_1526555215992_0001_conf.xml │ │ │ │ ├── job_1526555215992_0002-1526555694494-user-QuasiMonteCarlo-1526555709175-1-1-SUCCEEDED-default-1526555699708.jhist │ │ │ │ └── job_1526555215992_0002_conf.xml │ │ └── done_intermediate │ │ │ └── user │ │ │ ├── job_1526555215992_0004-1526567229183-user-QuasiMonteCarlo-1526567243482-1-1-SUCCEEDED-default-1526567234171.jhist │ │ │ └── job_1526555215992_0004_conf.xml │ ├── log4j.properties │ ├── mapred-site.xml │ ├── mrdata │ │ ├── mapperTaskCounter1.properties │ │ ├── mapperTaskCounter2.properties │ │ ├── mapperTaskCounter3.properties │ │ ├── reducerTaskCounter1.properties │ │ ├── sampleJobConf.properties │ │ └── sampleJobCounter.properties │ ├── spark-defaults.conf │ ├── spark_event_logs │ │ ├── event_log_1 │ │ └── event_log_2 │ ├── test-init.sql │ └── tunein-test1.sql └── rest │ └── RestAPITest.java ├── travis.sh └── web ├── app ├── adapters │ └── application.js ├── app.js ├── components │ ├── heuristic-details-list.js │ ├── loading-panel.js │ ├── map-reduce-exception.js │ ├── paging-panel.js │ ├── search-panel.js │ ├── single-heuristic-detail.js │ ├── single-tab.js │ ├── user-tabs.js │ └── user-tags.js ├── controllers │ ├── app.js │ ├── dashboard.js │ ├── dashboard │ │ ├── app.js │ │ ├── job.js │ │ └── workflow.js │ ├── job.js │ ├── not-found.js │ ├── search.js │ ├── user-details.js │ ├── workflow-exceptions.js │ └── workflow.js ├── helpers │ ├── eq.js │ ├── get-bootstrap-severity-code.js │ ├── get-color-for-severity.js │ ├── get-date.js │ ├── get-duration-breakdown.js │ ├── get-percentage.js │ ├── get-resource-in-gb-hours-value.js │ ├── get-resource-in-gbhours.js │ ├── gt.js │ ├── not-empty.js │ └── url-encode.js ├── index.html ├── initializers │ ├── component-router-injector.js │ └── notification-injector.js ├── models │ ├── application-summary.js │ ├── application.js │ ├── dashboard-summary.js │ ├── exception-status.js │ ├── job-summary.js │ ├── job.js │ ├── search-option.js │ ├── search-result.js │ ├── user-detail.js │ ├── users.js │ ├── workflow-exception.js │ ├── workflow-summary.js │ └── workflow.js ├── resolver.js ├── router.js ├── routes │ ├── app.js │ ├── dashboard.js │ ├── dashboard │ │ ├── app.js │ │ ├── job.js │ │ └── workflow.js │ ├── index.js │ ├── job.js │ ├── not-found.js │ ├── search.js │ ├── user-details.js │ ├── work-in-progress.js │ ├── workflow-exceptions.js │ └── workflow.js ├── serializers │ ├── app.js │ ├── application-summary.js │ ├── application.js │ ├── job-summary.js │ ├── job.js │ ├── workflow-summary.js │ └── workflow.js ├── styles │ ├── app.css │ └── partials │ │ ├── aggregated-metrics.css │ │ ├── application-menu.css │ │ ├── application.css │ │ ├── breadcrumbs.css │ │ ├── dashboard-header.css │ │ ├── heuristic-detail.css │ │ ├── heuristics-summary.css │ │ ├── jobs-severity.css │ │ ├── loading-panel.css │ │ ├── navbar.css │ │ ├── not-found.css │ │ ├── search-panel.css │ │ ├── search.css │ │ ├── user-detail.css │ │ ├── user-tabs.css │ │ └── user-tags.css ├── templates │ ├── app.hbs │ ├── application.hbs │ ├── components │ │ ├── aggregated-metrics.hbs │ │ ├── application-list.hbs │ │ ├── flow-list.hbs │ │ ├── heuristic-details-list.hbs │ │ ├── heuristics-summary.hbs │ │ ├── job-list.hbs │ │ ├── jobs-severity.hbs │ │ ├── loading-panel.hbs │ │ ├── map-reduce-exception.hbs │ │ ├── paging-panel.hbs │ │ ├── search-panel.hbs │ │ ├── single-application.hbs │ │ ├── single-flow.hbs │ │ ├── single-heuristic-detail.hbs │ │ ├── single-job.hbs │ │ ├── single-tab.hbs │ │ ├── tasks-severity.hbs │ │ ├── user-tabs.hbs │ │ └── user-tags.hbs │ ├── dashboard.hbs │ ├── dashboard │ │ ├── app.hbs │ │ ├── job.hbs │ │ └── workflow.hbs │ ├── job.hbs │ ├── loading.hbs │ ├── not-found.hbs │ ├── search.hbs │ ├── user-details.hbs │ ├── work-in-progress.hbs │ ├── workflow-exceptions.hbs │ └── workflow.hbs └── utils │ └── scheduler.js ├── bower.json ├── config └── environment.js ├── ember-cli-build.js ├── package.json ├── public └── assets │ └── images │ ├── loading.gif │ ├── logo.png │ ├── runtime.png │ ├── usedmemory.png │ ├── waittime.png │ └── wastedmemory.png ├── testem.js └── tests ├── helpers ├── destroy-app.js ├── module-for-acceptance.js ├── resolver.js └── start-app.js ├── index.html ├── integration └── components │ ├── aggregated-metrics-test.js │ ├── heuristic-details-list-test.js │ ├── heuristics-summary-test.js │ ├── jobs-severity-test.js │ ├── single-application-test.js │ ├── single-flow-test.js │ ├── single-heuristic-detail-test.js │ ├── single-job-test.js │ ├── single-tab-test.js │ ├── tasks-severity-test.js │ └── user-tabs-test.js ├── test-helper.js └── unit ├── helpers ├── eq-test.js ├── get-bootstrap-severity-code-test.js ├── get-color-for-severity-test.js ├── get-date-test.js ├── get-duration-breakdown-test.js ├── get-percentage-test.js ├── get-resource-in-gbhours-test.js ├── gt-test.js ├── not-empty-test.js └── url-encode-test.js └── utils └── scheduler-test.js /.gitignore: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2016 LinkedIn Corp. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | # use this file except in compliance with the License. You may obtain a copy of 6 | # the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations under 14 | # the License. 15 | # 16 | 17 | # general 18 | *~ 19 | *.log 20 | dr_elephant.log.* 21 | tmp 22 | dump 23 | .history 24 | /*.iml 25 | /dr-elephant-*/ 26 | /out 27 | 28 | # Eclipse 29 | .settings 30 | .cache 31 | .project 32 | .classpath 33 | .scala_dependencies 34 | bin 35 | 36 | # IDEA 37 | /.idea 38 | /.idea_modules 39 | 40 | # SBT 41 | dist 42 | project/project 43 | project/boot 44 | project/target 45 | project/plugins/target 46 | target 47 | .target 48 | 49 | # Play 50 | logs 51 | RUNNING_PID 52 | 53 | # macOS 54 | .DS_Store 55 | 56 | *.jar 57 | 58 | #web 59 | public/assets/ember/ 60 | public/assets/fonts/ 61 | web/bower_components/ 62 | web/node_modules/ 63 | web/package-lock.json 64 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: scala 2 | sudo: true 3 | jdk: 4 | - openjdk8 5 | python: "2.6" 6 | install: 7 | - sudo pip install inspyred 8 | - sudo pip install argparse 9 | 10 | script: 11 | - ./travis.sh 12 | 13 | # only build PRs plus branches master and customSHSWork (not all branch pushes) 14 | branches: 15 | only: 16 | - master 17 | - customSHSWork 18 | 19 | env: 20 | - PSO_DIR_PATH=$TRAVIS_BUILD_DIR/scripts/pso/ 21 | 22 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/analysis/ApplicationType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.analysis; 18 | 19 | /** 20 | * Manages and represents supported application types. 21 | */ 22 | public class ApplicationType { 23 | private final String _name; 24 | 25 | public ApplicationType(String name) { 26 | _name = name.toUpperCase(); 27 | } 28 | 29 | @Override 30 | public int hashCode() { 31 | return _name.hashCode(); 32 | } 33 | 34 | @Override 35 | public boolean equals(Object other) { 36 | if (other instanceof ApplicationType) { 37 | return ((ApplicationType) other).getName().equals(getName()); 38 | } 39 | return false; 40 | } 41 | 42 | /** 43 | * Get the name 44 | * 45 | * @return the name of the application type 46 | */ 47 | public String getName() { 48 | return _name; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/analysis/ElephantBackfillFetcher.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.analysis; 18 | 19 | import java.util.List; 20 | 21 | /** 22 | * Interface to be implemented by fetchers to support backfill. 23 | */ 24 | public interface ElephantBackfillFetcher { 25 | /** 26 | * Fetches a list of jobs to be backfilled for analysis by Dr. Elephant. It is recommended that the backfill fetcher 27 | * sets the app type for each job by calling {@link AnalyticJob#setAppType(ApplicationType)}. 28 | * 29 | * @param startTime Start time from when jobs have to be backfilled. 30 | * @param endTime End time upto which jobs can be backfilled. 31 | * @return list of jobs to be backfilled for analysis. 32 | * @throws Exception 33 | */ 34 | List fetchJobsForBackfill(long startTime, long endTime) throws Exception; 35 | } -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/analysis/ElephantFetcher.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.analysis; 18 | 19 | /** 20 | * The interface to define common methods for each fetcher. 21 | * 22 | * There would be a different fetcher implementation given a different Hadoop version and a different application type. 23 | */ 24 | public interface ElephantFetcher { 25 | 26 | /** 27 | * Given an application id, fetches the data object 28 | * 29 | * @param job The job being analysed 30 | * @return the fetched data 31 | * @throws Exception 32 | */ 33 | public T fetchData(AnalyticJob job) 34 | throws Exception; 35 | } -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/analysis/HadoopMetricsAggregator.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.analysis; 18 | 19 | public interface HadoopMetricsAggregator { 20 | public void aggregate(HadoopApplicationData data); 21 | public HadoopAggregatedData getResult(); 22 | } 23 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/analysis/Heuristic.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.analysis; 18 | 19 | import com.linkedin.drelephant.configurations.heuristic.HeuristicConfigurationData; 20 | 21 | 22 | /** 23 | * This interface defines the Heuristic rule interface. 24 | * 25 | * @param An implementation that extends from HadoopApplicationData 26 | */ 27 | public interface Heuristic { 28 | /** 29 | * Given an application data instance, returns the analyzed heuristic result. 30 | * 31 | * @param data The data to analyze 32 | * @return The heuristic result 33 | */ 34 | public HeuristicResult apply(T data); 35 | 36 | /** 37 | * Get the heuristic Configuration 38 | * 39 | * @return the heuristic configuration data 40 | */ 41 | public HeuristicConfigurationData getHeuristicConfData(); 42 | } 43 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/analysis/HeuristicResultDetails.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.analysis; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | 23 | /** 24 | * Holds the analysis details for each Heuristic 25 | */ 26 | public class HeuristicResultDetails { 27 | 28 | private String _name; 29 | private String _value; 30 | private String _details; 31 | 32 | public HeuristicResultDetails(String name, String value) { 33 | this(name, value, null); 34 | } 35 | 36 | public HeuristicResultDetails(String name, String value, String details) { 37 | this._name = name; 38 | this._value = value; 39 | this._details = details; 40 | } 41 | 42 | public String getDetails() { 43 | return _details; 44 | } 45 | 46 | public String getValue() { 47 | return _value; 48 | } 49 | 50 | public String getName() { 51 | return _name; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/configurations/scheduler/SchedulerConfigurationData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.configurations.scheduler; 18 | 19 | import java.util.Map; 20 | 21 | 22 | /** 23 | * Scheduler Configuration Holder 24 | */ 25 | public class SchedulerConfigurationData { 26 | private final String _schedulerName; 27 | private final String _className; 28 | private final Map _paramMap; 29 | 30 | public SchedulerConfigurationData(String schedulerName, String className, Map paramMap) { 31 | _schedulerName = schedulerName; 32 | _className = className; 33 | _paramMap = paramMap; 34 | } 35 | 36 | public String getSchedulerName() { 37 | return _schedulerName; 38 | } 39 | 40 | public String getClassName() { 41 | return _className; 42 | } 43 | 44 | public Map getParamMap() { 45 | return _paramMap; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/exceptions/JobState.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.exceptions; 18 | 19 | /** 20 | * This enum represents the state of the job 21 | */ 22 | public enum JobState { 23 | SCRIPTFAIL, SCHEDULERFAIL, MRFAIL, SUCCEEDED, KILLED 24 | } 25 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/mapreduce/heuristics/CommonConstantsHeuristic.java: -------------------------------------------------------------------------------- 1 | package com.linkedin.drelephant.mapreduce.heuristics; 2 | 3 | public class CommonConstantsHeuristic { 4 | 5 | public static final String MAPPER_SPEED="Mapper Speed"; 6 | public static final String TOTAL_INPUT_SIZE_IN_MB="Total input size in MB"; 7 | } 8 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/mapreduce/heuristics/MapperGCHeuristic.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.mapreduce.heuristics; 18 | 19 | import com.linkedin.drelephant.mapreduce.data.MapReduceApplicationData; 20 | import com.linkedin.drelephant.mapreduce.data.MapReduceTaskData; 21 | import com.linkedin.drelephant.configurations.heuristic.HeuristicConfigurationData; 22 | 23 | 24 | public class MapperGCHeuristic extends GenericGCHeuristic { 25 | 26 | public MapperGCHeuristic(HeuristicConfigurationData heuristicConfData) { 27 | super(heuristicConfData); 28 | } 29 | 30 | @Override 31 | protected MapReduceTaskData[] getTasks(MapReduceApplicationData data) { 32 | return data.getMapperData(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/mapreduce/heuristics/MapperMemoryHeuristic.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.mapreduce.heuristics; 18 | 19 | import com.linkedin.drelephant.mapreduce.data.MapReduceApplicationData; 20 | import com.linkedin.drelephant.mapreduce.data.MapReduceTaskData; 21 | import com.linkedin.drelephant.configurations.heuristic.HeuristicConfigurationData; 22 | 23 | 24 | public class MapperMemoryHeuristic extends GenericMemoryHeuristic { 25 | public static final String MAPPER_MEMORY_CONF = "mapreduce.map.memory.mb"; 26 | 27 | public MapperMemoryHeuristic(HeuristicConfigurationData _heuristicConfData) { 28 | super(MAPPER_MEMORY_CONF, _heuristicConfData); 29 | } 30 | 31 | @Override 32 | protected MapReduceTaskData[] getTasks(MapReduceApplicationData data) { 33 | return data.getMapperData(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/mapreduce/heuristics/ReducerGCHeuristic.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.mapreduce.heuristics; 18 | 19 | import com.linkedin.drelephant.mapreduce.data.MapReduceApplicationData; 20 | import com.linkedin.drelephant.mapreduce.data.MapReduceTaskData; 21 | import com.linkedin.drelephant.configurations.heuristic.HeuristicConfigurationData; 22 | 23 | 24 | public class ReducerGCHeuristic extends GenericGCHeuristic { 25 | 26 | public ReducerGCHeuristic(HeuristicConfigurationData _heuristicConfData) { 27 | super(_heuristicConfData); 28 | } 29 | 30 | @Override 31 | protected MapReduceTaskData[] getTasks(MapReduceApplicationData data) { 32 | return data.getReducerData(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/mapreduce/heuristics/ReducerMemoryHeuristic.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.mapreduce.heuristics; 18 | 19 | import com.linkedin.drelephant.mapreduce.data.MapReduceApplicationData; 20 | import com.linkedin.drelephant.mapreduce.data.MapReduceTaskData; 21 | import com.linkedin.drelephant.configurations.heuristic.HeuristicConfigurationData; 22 | 23 | 24 | public class ReducerMemoryHeuristic extends GenericMemoryHeuristic { 25 | public static final String REDUCER_MEMORY_CONF = "mapreduce.reduce.memory.mb"; 26 | 27 | public ReducerMemoryHeuristic(HeuristicConfigurationData _heuristicConfData) { 28 | super(REDUCER_MEMORY_CONF, _heuristicConfData); 29 | } 30 | 31 | @Override 32 | protected MapReduceTaskData[] getTasks(MapReduceApplicationData data) { 33 | return data.getReducerData(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/priorityexecutor/Priority.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.priorityexecutor; 18 | 19 | public enum Priority { 20 | MIN_PRIORITY(Integer.MIN_VALUE), 21 | LOW(-100), 22 | NORMAL(0), 23 | HIGH(100), 24 | MAX_PRIORITY(Integer.MAX_VALUE); 25 | 26 | private int intPriority; 27 | 28 | Priority(int priority) { 29 | intPriority = priority; 30 | } 31 | 32 | /** 33 | * Get integer priority. 34 | * @return priority in integer. 35 | */ 36 | public int getPriority() { 37 | return intPriority; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/spark/data/SparkLogDerivedData.scala: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.spark.data 18 | 19 | import org.apache.spark.scheduler.SparkListenerEnvironmentUpdate 20 | 21 | 22 | case class SparkLogDerivedData(environmentUpdate: SparkListenerEnvironmentUpdate) { 23 | def appConfigurationProperties: Map[String, String] = environmentUpdate.environmentDetails("Spark Properties").toMap 24 | } 25 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/spark/data/SparkRestDerivedData.scala: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.spark.data 18 | 19 | import com.linkedin.drelephant.spark.fetchers.statusapiv1.{ApplicationInfo, ExecutorSummary, JobData, StageData} 20 | 21 | 22 | case class SparkRestDerivedData( 23 | applicationInfo: ApplicationInfo, 24 | jobDatas: Seq[JobData], 25 | stageDatas: Seq[StageData], 26 | executorSummaries: Seq[ExecutorSummary], 27 | private[spark] val logDerivedData: Option[SparkLogDerivedData] = None) 28 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/spark/fetchers/statusapiv1/StageStatus.java: -------------------------------------------------------------------------------- 1 | /* 2 | *Added this class to accommodate the status "PENDING" for stages. 3 | * 4 | *TODO: remove this class if using the spark version having "PENDING" StageStatus. 5 | */ 6 | 7 | package com.linkedin.drelephant.spark.fetchers.statusapiv1; 8 | 9 | import org.apache.spark.util.EnumUtil; 10 | 11 | public enum StageStatus { 12 | ACTIVE, 13 | COMPLETE, 14 | FAILED, 15 | SKIPPED, 16 | PENDING; 17 | 18 | private StageStatus() { 19 | } 20 | 21 | public static StageStatus fromString(String str) { 22 | return (StageStatus) EnumUtil.parseIgnoreCase(StageStatus.class, str); 23 | } 24 | } -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/spark/legacydata/SparkApplicationData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.spark.legacydata; 18 | 19 | import com.linkedin.drelephant.analysis.HadoopApplicationData; 20 | 21 | 22 | /** 23 | * This holds a collection of all SparkApplicationData 24 | */ 25 | public interface SparkApplicationData extends HadoopApplicationData { 26 | 27 | public boolean isThrottled(); 28 | 29 | public SparkGeneralData getGeneralData(); 30 | 31 | public SparkEnvironmentData getEnvironmentData(); 32 | 33 | public SparkExecutorData getExecutorData(); 34 | 35 | public SparkJobProgressData getJobProgressData(); 36 | 37 | public SparkStorageData getStorageData(); 38 | } 39 | -------------------------------------------------------------------------------- /app/com/linkedin/drelephant/tez/heuristics/ReducerGCHeuristic.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 Electronic Arts Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | * 16 | */ 17 | package com.linkedin.drelephant.tez.heuristics; 18 | 19 | import com.linkedin.drelephant.configurations.heuristic.HeuristicConfigurationData; 20 | import com.linkedin.drelephant.tez.data.TezApplicationData; 21 | import com.linkedin.drelephant.tez.data.TezTaskData; 22 | import org.apache.log4j.Logger; 23 | 24 | 25 | /** 26 | * Analyses garbage collection efficiency 27 | */ 28 | public class ReducerGCHeuristic extends GenericGCHeuristic { 29 | 30 | private static final Logger logger = Logger.getLogger(ReducerGCHeuristic.class); 31 | 32 | public ReducerGCHeuristic(HeuristicConfigurationData heuristicConfData) { 33 | super(heuristicConfData); 34 | } 35 | 36 | @Override 37 | protected TezTaskData[] getTasks(TezApplicationData data) { 38 | return data.getReduceTaskData(); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/controllers/api/v1/.Web.java.swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/app/controllers/api/v1/.Web.java.swp -------------------------------------------------------------------------------- /app/views/help/helpNoData.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 |

18 | This means that the JobTracker no longer provides information to Dr. Elephant for that job.
19 | The JobTracker wipes job data fairly quickly, and sometimes, will result in an empty set of data for certain jobs. 20 |

-------------------------------------------------------------------------------- /app/views/help/mapreduce/helpDistributedCacheLimit.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2017 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 |

Jobs which put large files(> 500MB) in the distributed cache are flagged.

18 |

Files as part of the following are considered.

19 |
    20 |
  • 21 | mapreduce.job.cache.files 22 |
  • 23 |
  • 24 | mapreduce.job.cache.archives 25 |
  • 26 |
27 |

-------------------------------------------------------------------------------- /app/views/help/mapreduce/helpException.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 |

18 | Dr. Elephant now starts to provide exception info for failed jobs.
19 | The stacktrace is the exception of the failed task that caused this job to fail.
20 | Some failed jobs does not have a valid stacktrace reported by Hadoop. In this case, Dr. Elephant cannot provide the stacktrace.
21 | If Dr. Elephant cannot provide the exception, try to mine by yourself in its job history page.
22 | For example, some real exceptions appear at the end of the Application Master log.
23 | Some real exceptions appear in the task log.
24 | We hope to provide your more insights over these exceptions in the future. 25 |

-------------------------------------------------------------------------------- /app/views/help/mapreduce/helpMapperMemory.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 | @helpMemory() -------------------------------------------------------------------------------- /app/views/help/mapreduce/helpReducerMemory.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 | @helpMemory() -------------------------------------------------------------------------------- /app/views/help/metrics/helpRuntime.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 | @import com.linkedin.drelephant.analysis.Metrics; 18 | 19 |

20 | The runtime metrics shows the total runtime of your job.

21 |

22 | 23 |

Calculation

24 |
25 | The runtime of the job is the difference between the time when the job was submitted to the resource manager and when the job finished. 26 |
27 | 28 |

Example

29 | Let the submit time of a job be 1461837302868 ms
30 | Let the finish time of the job be 1461840952182 ms
31 | The runtime of the job will be 1461840952182 - 1461837302868 = 3649314 ms or 1.01 hours 32 | 33 | -------------------------------------------------------------------------------- /app/views/help/spark/helpConfigurationHeuristic.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 |

The results from this heuristic primarily inform you about key app 17 | configuration settings, including driver memory, driver cores, executor cores, 18 | executor instances, executor memory, and the serializer.

19 |

It also checks the values of dynamically allocated min and max executors, the specified yarn jars, executor and driver memory overhead and whether other configuration values are within threshold.

20 |

Suggestions

21 |

Suggestions based on the configurations you have set are given in the heuristic result itself.

-------------------------------------------------------------------------------- /app/views/help/spark/helpEventLogLimit.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 |

17 | Spark's event log passer currently cannot handle very large event log files. It will take too long for Dr Elephant to 18 | analyze it that might endanger the entire server. Therefore, currently we sets up a limit (100MB) for event log files, 19 | and will by-pass the log-fetching process if the log size exceeds the limit. 20 |

-------------------------------------------------------------------------------- /app/views/help/spark/helpExecutorGcHeuristic.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 |

This analysis shows how much time a job is spending in GC. To normalise the results across all jobs, the ratio of the time a job spends in Gc to the total run time of the job is calculated.

18 |

A job is flagged if the ratio is too high, meaning the job spends too much time in GC.

19 |

Suggestions

20 |

We recommend increasing the executor memory.

-------------------------------------------------------------------------------- /app/views/help/spark/helpJobsHeuristic.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 |

This heuristic reports job failures and high task failure rates for 17 | each job.

18 | 19 |

Job/task failures can occur for a number of reasons, so it is 20 | recommended to look at the YARN application error logs.

21 | -------------------------------------------------------------------------------- /app/views/help/spark/helpStagesHeuristic.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 |

This heuristic reports stage failures, high task failure rates for 17 | each stage, and long average executor runtimes for each stage.

18 | 19 |

Stage/task failures can occur for a number of reasons, so it is 20 | recommended to look at the YARN application error logs.

21 | -------------------------------------------------------------------------------- /app/views/index.scala.html: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | DrElephant 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/views/page/homePage.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 | @(numJobsAnalyzed: Int, numJobsSevere: Int, numJobsCritical: Int)(results: Html) 18 | 19 | @* 20 | * The layout of the homepage of Dr. Elephant or the dashboard 21 | * 22 | * @param numJobsAnalyzed The count of total jobs analysed by Dr. Elephant 23 | * @param numJobsSevere The number of jobs which are in severe state 24 | * @param numJobsCritical The number of jobs which are in critical state 25 | * @param results The results to be displayed on the dashboard 26 | *@ 27 | 28 | @main("Dr. Elephant", "dashboard") { 29 |
30 |

Hello there, I've been busy!

31 |

I looked through @numJobsAnalyzed jobs today.
32 | About @numJobsSevere of them could use some tuning.
33 | About @numJobsCritical of them need some serious attention! 34 |

35 |
36 | @results 37 | } 38 | -------------------------------------------------------------------------------- /app/views/results/searchResults.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 | @(title: String, results: java.util.List[models.AppResult]) 18 | 19 | @* 20 | * The layout of the job results. 21 | * 22 | * @param title The title of the search results 23 | * @param results The search results to be displayed 24 | *@ 25 | 26 |
27 |
28 |

@title

29 |
30 | @if(results != null && results.nonEmpty) { 31 |
32 | @for(result <- results) { 33 | 35 | @tags.jobSummary(result) 36 | 37 | } 38 |
39 | } 40 |
41 | -------------------------------------------------------------------------------- /app/views/tags/column.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | @(width: Int)(content: Html) 17 |
18 | @content 19 |
-------------------------------------------------------------------------------- /app/views/tags/jobHeader.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 | @(result: models.AppResult) 18 | 19 | @* 20 | * The job header includes the following info, 21 | * The user who ran the job 22 | * The job type 23 | * The job id 24 | * And the analysis time 25 | * 26 | * @param result The job of type AppResult 27 | *@ 28 | 29 |

30 |

[@result.username] [@result.jobType] @result.id

31 |
32 |
@result.name
33 |

34 | 35 | 39 | -------------------------------------------------------------------------------- /app/views/tags/jobSummary.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | 17 | @(result: models.AppResult) 18 | 19 | @* 20 | * Displays a brief info of the job. 21 | * The job block includes, the job header and the heuristic info. 22 | * 23 | * @param result The job of type AppResult 24 | *@ 25 | 26 | @tags.jobHeader(result) 27 |

28 | @for(appHeuristicResult <- result.yarnAppHeuristicResults) { 29 | @appHeuristicResult.heuristicName 30 | } 31 |

32 | @tags.aggregatedMetrics(result) -------------------------------------------------------------------------------- /app/views/tags/panel.scala.html: -------------------------------------------------------------------------------- 1 | @* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | *@ 16 | @()(title: Html)(body: Html) 17 |
18 |
19 |

@title

20 |
21 |
22 | @body 23 |
24 |
-------------------------------------------------------------------------------- /checkstyle.sbt: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2016 LinkedIn Corp. 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | // use this file except in compliance with the License. You may obtain a copy of 6 | // the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | // License for the specific language governing permissions and limitations under 14 | // the License. 15 | // 16 | 17 | // 18 | // sbt-checkstyle-plugin specific configurations go in this file 19 | // 20 | 21 | // Path and name of checkstyle configuration file 22 | checkstyleConfigLocation := CheckstyleConfigLocation.File("project/checkstyle-config.xml") 23 | 24 | // Generate HTML report in addition to default XML report by applying XSLT transformations 25 | checkstyleXsltTransformations := { 26 | Some(Set(CheckstyleXSLTSettings(baseDirectory(_ / "project/checkstyle-noframes-severity-sorted-modified.xsl").value, target(_ / "checkstyle-report.html").value))) 27 | } 28 | -------------------------------------------------------------------------------- /compile.conf: -------------------------------------------------------------------------------- 1 | hadoop_version=2.7.3 2 | spark_version=1.6.2 3 | play_opts="-Dsbt.repository.config=app-conf/resolver.conf" 4 | -------------------------------------------------------------------------------- /conf/evolutions/default/2.sql: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2016 LinkedIn Corp. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | # use this file except in compliance with the License. You may obtain a copy of 6 | # the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations under 14 | # the License. 15 | # 16 | 17 | # --- Indexing on queue for search by queue feature 18 | # --- !Ups 19 | 20 | create index yarn_app_result_i8 on yarn_app_result (queue_name); 21 | 22 | # --- !Downs 23 | 24 | drop index yarn_app_result_i8 on yarn_app_result; 25 | 26 | -------------------------------------------------------------------------------- /conf/evolutions/default/3.sql: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2016 LinkedIn Corp. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | # use this file except in compliance with the License. You may obtain a copy of 6 | # the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations under 14 | # the License. 15 | # 16 | 17 | # --- Indexing on queue for seach by queue feature 18 | # --- !Ups 19 | 20 | alter table yarn_app_result add column resource_used BIGINT UNSIGNED DEFAULT 0 COMMENT 'The resources used by the job in MB Seconds'; 21 | alter table yarn_app_result add column resource_wasted BIGINT UNSIGNED DEFAULT 0 COMMENT 'The resources wasted by the job in MB Seconds'; 22 | alter table yarn_app_result add column total_delay BIGINT UNSIGNED DEFAULT 0 COMMENT 'The total delay in starting of mappers and reducers'; 23 | 24 | # --- !Downs 25 | 26 | alter table yarn_app_result drop resource_used; 27 | alter table yarn_app_result drop resource_wasted; 28 | alter table yarn_app_result drop total_delay; 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /conf/evolutions/default/4.sql: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2016 LinkedIn Corp. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | # use this file except in compliance with the License. You may obtain a copy of 6 | # the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations under 14 | # the License. 15 | # 16 | 17 | # --- Indexing on severity,finish_time for count on welcome page 18 | # --- !Ups 19 | 20 | create index yarn_app_result_i9 on yarn_app_result (severity,finish_time); 21 | 22 | # --- !Downs 23 | 24 | drop index yarn_app_result_i9 on yarn_app_result; 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /conf/evolutions/default/6.sql: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2016 LinkedIn Corp. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | # use this file except in compliance with the License. You may obtain a copy of 6 | # the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations under 14 | # the License. 15 | # 16 | 17 | # --- !Ups 18 | 19 | CREATE TABLE backfill_info ( 20 | app_type VARCHAR(20) NOT NULL COMMENT 'Application/Job Type e.g, Pig, Hive, Spark, HadoopJava', 21 | backfill_ts BIGINT UNSIGNED NOT NULL COMMENT 'The timestamp at which backfill should start from', 22 | 23 | PRIMARY KEY (app_type) 24 | ); 25 | 26 | # --- !Downs 27 | 28 | DROP TABLE backfill_info; 29 | -------------------------------------------------------------------------------- /conf/log4j.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2016 LinkedIn Corp. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | # use this file except in compliance with the License. You may obtain a copy of 6 | # the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations under 14 | # the License. 15 | # 16 | 17 | #Define the root logger with appender file 18 | log4j.rootLogger = INFO, FA 19 | 20 | #File Appender 21 | log4j.appender.FA=org.apache.log4j.DailyRollingFileAppender 22 | log4j.appender.FA.File=../logs/elephant/dr_elephant.log 23 | log4j.appender.FA.layout=org.apache.log4j.PatternLayout 24 | log4j.appender.FA.layout.ConversionPattern=%d{MM-dd-yyyy HH:mm:ss} %-5p [%t] %c %x: %m%n 25 | log4j.appender.FA.DatePattern='.'yyyy-MM-dd 26 | log4j.appender.FA.ImmediateFlush=true 27 | log4j.appender.FA.Append=true 28 | -------------------------------------------------------------------------------- /cpd.sbt: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2016 LinkedIn Corp. 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | // use this file except in compliance with the License. You may obtain a copy of 6 | // the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | // License for the specific language governing permissions and limitations under 14 | // the License. 15 | // 16 | 17 | // 18 | // cpd4sbt plugin settings for integrating with CPD which is used for code duplication 19 | // 20 | import de.johoop.cpd4sbt._ 21 | 22 | // By default language will be Java but this will be changed to run for Scala as well 23 | // while running build through Travis CI. 24 | cpdLanguage := Language.Java 25 | 26 | // Take distinct source directories to ensure whole file is not reported as duplicate 27 | // of itself. 28 | cpdSourceDirectories in Compile := (cpdSourceDirectories in Compile).value.distinct 29 | -------------------------------------------------------------------------------- /findbugs.sbt: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2016 LinkedIn Corp. 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | // use this file except in compliance with the License. You may obtain a copy of 6 | // the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | // License for the specific language governing permissions and limitations under 14 | // the License. 15 | // 16 | 17 | import de.johoop.findbugs4sbt.FindBugs._ 18 | import de.johoop.findbugs4sbt.Priority 19 | 20 | findbugsSettings 21 | 22 | // Only High priority Findbugs issues will be generated 23 | findbugsPriority := Priority.High 24 | 25 | // Exclude filters file to filter out certain files, folders or issues 26 | findbugsExcludeFilters := Some(scala.xml.XML.loadFile(baseDirectory.value / "project" / "findbugs-exclude-filters.xml")) 27 | -------------------------------------------------------------------------------- /images/wiki/compare-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/compare-page.png -------------------------------------------------------------------------------- /images/wiki/critical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/critical.png -------------------------------------------------------------------------------- /images/wiki/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/dashboard.png -------------------------------------------------------------------------------- /images/wiki/dr-elephant-logo-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/dr-elephant-logo-150x150.png -------------------------------------------------------------------------------- /images/wiki/dr-elephant-logo-300x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/dr-elephant-logo-300x300.png -------------------------------------------------------------------------------- /images/wiki/flow-history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/flow-history.png -------------------------------------------------------------------------------- /images/wiki/flowhistorymetrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/flowhistorymetrics.png -------------------------------------------------------------------------------- /images/wiki/job-history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/job-history.png -------------------------------------------------------------------------------- /images/wiki/jobdetails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/jobdetails.png -------------------------------------------------------------------------------- /images/wiki/jobhistorymetrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/jobhistorymetrics.png -------------------------------------------------------------------------------- /images/wiki/low.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/low.png -------------------------------------------------------------------------------- /images/wiki/moderate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/moderate.png -------------------------------------------------------------------------------- /images/wiki/none.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/none.png -------------------------------------------------------------------------------- /images/wiki/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/search.png -------------------------------------------------------------------------------- /images/wiki/severe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/severe.png -------------------------------------------------------------------------------- /images/wiki/suggestions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/images/wiki/suggestions.png -------------------------------------------------------------------------------- /jacoco.sbt: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2016 LinkedIn Corp. 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | // use this file except in compliance with the License. You may obtain a copy of 6 | // the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | // License for the specific language governing permissions and limitations under 14 | // the License. 15 | // 16 | 17 | import de.johoop.jacoco4sbt.JacocoPlugin._ 18 | import de.johoop.jacoco4sbt._ 19 | 20 | // Baselining coverage thresholds to current coverage values so that build fails with any drop in coverage 21 | jacoco.settings ++ Seq( 22 | jacoco.thresholds in jacoco.Config := Thresholds( 23 | instruction = 62, 24 | method = 65, 25 | branch = 41, 26 | complexity = 47, 27 | line = 62, 28 | clazz = 81) 29 | ) 30 | 31 | parallelExecution in jacoco.Config := false 32 | 33 | jacoco.outputDirectory in jacoco.Config := file("target/jacoco") 34 | 35 | jacoco.reportFormats in jacoco.Config := Seq(XMLReport(encoding = "utf-8"), HTMLReport("utf-8")) 36 | 37 | jacoco.excludes in jacoco.Config := Seq("views*", "*Routes*", "controllers*routes*", "controllers*Reverse*", "controllers*javascript*", "controller*ref*") 38 | -------------------------------------------------------------------------------- /project/build.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2016 LinkedIn Corp. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | # use this file except in compliance with the License. You may obtain a copy of 6 | # the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations under 14 | # the License. 15 | # 16 | 17 | sbt.version=0.13.9 18 | -------------------------------------------------------------------------------- /project/checkstyle-java.header: -------------------------------------------------------------------------------- 1 | ^/\*$ 2 | ^ \* Copyright \d{4} LinkedIn Corp.$ 3 | ^ \*$ 4 | ^ \* Licensed under the Apache License, Version 2.0 \(the "License"\); you may not$ 5 | ^ \* use this file except in compliance with the License. You may obtain a copy of$ 6 | ^ \* the License at$ 7 | ^ \*$ 8 | ^ \* http://www.apache.org/licenses/LICENSE-2.0$ 9 | ^ \*$ 10 | ^ \* Unless required by applicable law or agreed to in writing, software$ 11 | ^ \* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT$ 12 | ^ \* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the$ 13 | ^ \* License for the specific language governing permissions and limitations under$ 14 | ^ \* the License.$ 15 | ^ \*/$ 16 | -------------------------------------------------------------------------------- /project/checkstyle-suppressions.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 20 | 21 | 22 | 24 | 25 | -------------------------------------------------------------------------------- /project/plugins.sbt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | // Comment to get more information during initialization 17 | logLevel := Level.Warn 18 | 19 | // The Typesafe repository 20 | resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/" 21 | 22 | // Use the Play sbt plugin for Play projects 23 | addSbtPlugin("com.typesafe.play" % "sbt-plugin" % Option(System.getProperty("play.version")).getOrElse("2.2.2")) 24 | 25 | // Jacoco code coverage plugin 26 | addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.6") 27 | 28 | // Findbugs plugin 29 | addSbtPlugin("de.johoop" % "findbugs4sbt" % "1.4.0") 30 | 31 | // Copy paste detector plugin 32 | addSbtPlugin("de.johoop" % "cpd4sbt" % "1.2.0") 33 | 34 | // Checkstyle plugin 35 | addSbtPlugin("com.etsy" % "sbt-checkstyle-plugin" % "3.1.1") 36 | 37 | // Scalastyle plugin 38 | addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0") 39 | -------------------------------------------------------------------------------- /public/assets/analytics/track.js: -------------------------------------------------------------------------------- 1 | /* 2 | Paste the tracking javascript snippet into this file for web analytics. 3 | This javascript file will be included into every page in the application. 4 | See comments section above 'enable.analytics' in the application.conf file for 5 | more information. 6 | */ -------------------------------------------------------------------------------- /public/assets/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/assets/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/assets/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/assets/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/assets/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/assets/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/images/favicon.png -------------------------------------------------------------------------------- /public/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/images/loading.gif -------------------------------------------------------------------------------- /public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/images/logo.png -------------------------------------------------------------------------------- /public/images/runtime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/images/runtime.png -------------------------------------------------------------------------------- /public/images/usedmemory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/images/usedmemory.png -------------------------------------------------------------------------------- /public/images/waittime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/images/waittime.png -------------------------------------------------------------------------------- /public/images/wastedmemory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/public/images/wastedmemory.png -------------------------------------------------------------------------------- /public/js/flowresourcehistoryform.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $(document).ready(function(){ 18 | 19 | /* Plot graph for data obtained from ajax call */ 20 | $.getJSON('/rest/flowmetricsgraphdata?id=' + queryString()['flow-def-id'], function(data) { 21 | updateExecTimezone(data); 22 | 23 | // Compute the jobDefId list such that the job numbers in the tooltip match the corresponding job in the table. 24 | var jobDefList = []; 25 | for (var i = data.length - 1 ; i >=0 ; i--) { 26 | for (var j = 0; j < data[i].jobmetrics.length; j++) { 27 | var jobDefUrl = data[i].jobmetrics[j]["jobdefurl"]; 28 | if (jobDefList.indexOf(jobDefUrl) == -1) { 29 | jobDefList.push(jobDefUrl); 30 | } 31 | } 32 | } 33 | 34 | plotter(data, jobDefList); 35 | }); 36 | 37 | loadTableTooltips(); 38 | }); 39 | -------------------------------------------------------------------------------- /public/js/flowtimehistoryform.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $(document).ready(function(){ 18 | 19 | /* Plot graph for data obtained from ajax call */ 20 | $.getJSON('/rest/flowmetricsgraphdata?id=' + queryString()['flow-def-id'], function(data) { 21 | updateExecTimezone(data); 22 | 23 | // Compute the jobDefId list such that the job numbers in the tooltip match the corresponding job in the table. 24 | var jobDefList = []; 25 | for (var i = data.length - 1 ; i >=0 ; i--) { 26 | for (var j = 0; j < data[i].jobmetrics.length; j++) { 27 | var jobDefUrl = data[i].jobmetrics[j]["jobdefurl"]; 28 | if (jobDefList.indexOf(jobDefUrl) == -1) { 29 | jobDefList.push(jobDefUrl); 30 | } 31 | } 32 | } 33 | 34 | plotter(data, jobDefList); 35 | }); 36 | 37 | loadTableTooltips(); 38 | }); 39 | 40 | -------------------------------------------------------------------------------- /public/js/jobresourcesmetricshistoryform.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $(document).ready(function(){ 18 | 19 | /* Plot graph for data obtained from ajax call */ 20 | $.getJSON('/rest/jobmetricsgraphdata?id=' + queryString()['job-def-id'], function(data) { 21 | updateExecTimezone(data); 22 | plotter(data, []); 23 | }); 24 | 25 | loadTableTooltips(); 26 | }); 27 | 28 | -------------------------------------------------------------------------------- /public/js/jobtimehistoryform.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | $(document).ready(function(){ 18 | 19 | /* Plot graph for data obtained from ajax call */ 20 | $.getJSON('/rest/jobmetricsgraphdata?id=' + queryString()['job-def-id'], function(data) { 21 | updateExecTimezone(data); 22 | plotter(data, []); 23 | }); 24 | 25 | loadTableTooltips(); 26 | }); 27 | 28 | -------------------------------------------------------------------------------- /public/js/searchpanel.js: -------------------------------------------------------------------------------- 1 | 2 | $('.search_opt').on("click",function(){ 3 | $('#search_concept').text($(this).text()) 4 | console.log($(this).text()); 5 | }); 6 | 7 | $('#search_button').on("click", function() { 8 | let text = $('#primary_search').val(); 9 | let type = $('#search_concept').text(); 10 | let encodedurl = encodeURIComponent(text); 11 | if(type=='Workflow') { 12 | let transition = "/new#/workflow?workflowid=" + encodedurl; 13 | window.location = transition 14 | } else if (type=='Job') { 15 | let transition = "/new#/job?jobid=" + encodedurl; 16 | window.location = transition; 17 | } else if (type=='Application') { 18 | let transition = "/new#/app?applicationid=" + encodedurl; 19 | window.location = transition; 20 | } 21 | }); -------------------------------------------------------------------------------- /resolver.conf.template: -------------------------------------------------------------------------------- 1 | [repositories] 2 | local 3 | # label ":" url [ ["," ivyPattern] "," artifactPattern [", mavenCompatible"]] 4 | # custom_resolver : repo_url, [organization]/[module]/[revision]/[module]-[revision].ivy, [organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext], mavenCompatible 5 | -------------------------------------------------------------------------------- /scalastyle.sbt: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2016 LinkedIn Corp. 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | // use this file except in compliance with the License. You may obtain a copy of 6 | // the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | // License for the specific language governing permissions and limitations under 14 | // the License. 15 | // 16 | 17 | // 18 | // scalastyle-sbt-plugin specific configurations go in this file 19 | // 20 | 21 | // Do not fail on scalastyle errors as we want to baseline error numbers till 22 | // we fix all errors. We would fail the CI build if any new errors are introduced 23 | // through a PR. 24 | scalastyleFailOnError := false 25 | 26 | // Scalastyle config file location. 27 | scalastyleConfig := file("project/scalastyle-config.xml") 28 | -------------------------------------------------------------------------------- /scripts/stop.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 4 | # Copyright 2016 LinkedIn Corp. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 7 | # use this file except in compliance with the License. You may obtain a copy of 8 | # the License at 9 | # 10 | # http://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 15 | # License for the specific language governing permissions and limitations under 16 | # the License. 17 | # 18 | 19 | # Navigate to project root dir 20 | script_dir=`which $0` 21 | script_dir=`dirname $script_dir` 22 | project_root=$script_dir/../ 23 | cd $project_root 24 | 25 | # If file RUNNING_PID exists, it means Dr. Elephant is running 26 | if [ -f RUNNING_PID ]; 27 | then 28 | echo "Dr.Elephant is running." 29 | else 30 | echo "Dr.Elephant is not running." 31 | exit 1 32 | fi 33 | 34 | # RUNNING_PID contains PID of our Dr. Elephant instance 35 | proc=`cat RUNNING_PID` 36 | 37 | echo "Killing Dr.Elephant...." 38 | kill $proc 39 | 40 | # Wait for a while 41 | sleep 1 42 | 43 | # Play should remove RUNNING_PID when we kill the running process 44 | if [ ! -f RUNNING_PID ]; 45 | then 46 | echo "Dr.Elephant is killed." 47 | else 48 | echo "Failed to kill Dr.Elephant." 49 | exit 1 50 | fi 51 | -------------------------------------------------------------------------------- /test/com/linkedin/drelephant/mapreduce/fetchers/MapReduceFetcherHadoop2Test.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | package com.linkedin.drelephant.mapreduce.fetchers; 18 | 19 | import java.util.regex.Matcher; 20 | import java.util.regex.Pattern; 21 | 22 | import com.linkedin.drelephant.util.ThreadContextMR2; 23 | import org.junit.Assert; 24 | import org.junit.Test; 25 | 26 | 27 | public class MapReduceFetcherHadoop2Test { 28 | 29 | @Test 30 | public void testDiagnosticMatcher() { 31 | Matcher matcher = ThreadContextMR2.getDiagnosticMatcher("Task task_1443068695259_9143_m_000475 failed 1 time"); 32 | Assert.assertEquals(".*[\\s\\u00A0]+(task_[0-9]+_[0-9]+_[m|r]_[0-9]+)[\\s\\u00A0]+.*", matcher.pattern().toString()); 33 | Assert.assertEquals(true, matcher.matches()); 34 | Assert.assertEquals(1, matcher.groupCount()); 35 | Assert.assertEquals("task_1443068695259_9143_m_000475", matcher.group(1)); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /test/com/linkedin/drelephant/tez/fetchers/TezFetcherTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 Electronic Arts Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | * 16 | */ 17 | package com.linkedin.drelephant.tez.fetchers; 18 | 19 | import java.util.regex.Matcher; 20 | import org.junit.Assert; 21 | import org.junit.Test; 22 | import com.linkedin.drelephant.util.ThreadContextMR2; 23 | 24 | public class TezFetcherTest { 25 | 26 | @Test 27 | public void testDiagnosticMatcher() { 28 | Matcher matcher = ThreadContextMR2.getDiagnosticMatcher("Task task_1443068695259_9143_m_000475 failed 1 time"); 29 | Assert.assertEquals(".*[\\s\\u00A0]+(task_[0-9]+_[0-9]+_[m|r]_[0-9]+)[\\s\\u00A0]+.*", matcher.pattern().toString()); 30 | Assert.assertEquals(true, matcher.matches()); 31 | Assert.assertEquals(1, matcher.groupCount()); 32 | Assert.assertEquals("task_1443068695259_9143_m_000475", matcher.group(1)); 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /test/resources/SchedulerConf.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | airflow 23 | com.linkedin.drelephant.schedulers.AirflowScheduler 24 | 25 | http://localhost:8000 26 | 27 | 28 | 29 | 30 | azkaban 31 | com.linkedin.drelephant.schedulers.AzkabanScheduler 32 | 33 | 34 | 35 | oozie 36 | com.linkedin.drelephant.schedulers.OozieScheduler 37 | 38 | http://oozie/ 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest1.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | mapreduce 21 | com.linkedin.drelephant.mapreduce.fetchers.MapReduceFetcherHadoop2 22 | 23 | 24 | spark 25 | org.apache.spark.deploy.history.SparkFSFetcher 26 | 27 | 28 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest10.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | mapreduce 21 | com.linkedin.drelephant.mapreduce.fetchers.MapReduceFSFetcherHadoop2 22 | 23 | true 24 | 200 25 | PST 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest11.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | mapreduce 21 | com.linkedin.drelephant.mapreduce.fetchers.MapReduceFSFetcherHadoop2 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest2.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | mapreduce 21 | com.linkedin.drelephant.mapreduce.fetchers.MapReduceFetcherHadoop2 22 | 23 | 24 | spark 25 | org.apache.spark.deploy.history.SparkFSFetcher 26 | 27 | 28 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest3.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | mapreduce 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest4.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | com.linkedin.drelephant.mapreduce.fetchers.MapReduceFetcherHadoop2 21 | 22 | 23 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest5.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | spark 21 | org.apache.spark.deploy.history.SparkFSFetcher 22 | 23 | 50 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest6.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | spark 21 | org.apache.spark.deploy.history.SparkFSFetcher 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest7.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | spark 21 | org.apache.spark.deploy.history.SparkFSFetcher 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest8.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | spark 21 | org.apache.spark.deploy.history.SparkFSFetcher 22 | 23 | sample-ha3.grid.example.com:50070,sample-ha4.grid.example.com:50070 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /test/resources/configurations/fetcher/FetcherConfTest9.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | mapreduce 21 | com.linkedin.drelephant.mapreduce.fetchers.MapReduceFSFetcherHadoop2 22 | 23 | 24 | -------------------------------------------------------------------------------- /test/resources/configurations/jobtype/JobTypeConfTest2.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | Spark 22 | spark 23 | spark.app.id 24 | 25 | 26 | 27 | Pig 28 | mapreduce 29 | pig.script 30 | 31 | 32 | mapreduce 33 | hive.mapred.mode 34 | 35 | 36 | Cascading 37 | mapreduce 38 | cascading.app.frameworks 39 | 40 | 41 | HadoopJava 42 | mapreduce 43 | mapred.child.java.opts 44 | 45 | 46 | -------------------------------------------------------------------------------- /test/resources/configurations/jobtype/JobTypeConfTest3.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | Spark 22 | spark 23 | 24 | 25 | 26 | Pig 27 | mapreduce 28 | 29 | 30 | Hive 31 | mapreduce 32 | hive.mapred.mode 33 | 34 | 35 | Cascading 36 | mapreduce 37 | cascading.app.frameworks 38 | 39 | 40 | HadoopJava 41 | mapreduce 42 | mapred.child.java.opts 43 | 44 | 45 | -------------------------------------------------------------------------------- /test/resources/configurations/jobtype/JobTypeConfTest4.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | Spark 22 | spark 23 | spark.app.id 24 | 25 | 26 | 27 | Pig 28 | pig.script 29 | 30 | 31 | Hive 32 | hive.mapred.mode 33 | 34 | 35 | Cascading 36 | mapreduce 37 | cascading.app.frameworks 38 | 39 | 40 | HadoopJava 41 | mapreduce 42 | mapred.child.java.opts 43 | 44 | 45 | -------------------------------------------------------------------------------- /test/resources/configurations/jobtype/JobTypeConfTest5.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | Voldemort 21 | mapreduce 22 | mapred.reducer.class 23 | [(voldemort) 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /test/resources/configurations/scheduler/SchedulerConfTest1.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | airflow 22 | com.linkedin.drelephant.schedulers.AirflowScheduler 23 | 24 | http://localhost:8000 25 | 26 | 27 | 28 | 29 | azkaban 30 | com.linkedin.drelephant.schedulers.AzkabanScheduler 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /test/resources/configurations/scheduler/SchedulerConfTest2.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | airflow 22 | 23 | http://localhost:8000 24 | 25 | 26 | 27 | 28 | azkaban 29 | com.linkedin.drelephant.schedulers.AzkabanScheduler 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /test/resources/configurations/scheduler/SchedulerConfTest3.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | airflow 22 | com.linkedin.drelephant.schedulers.AirflowScheduler 23 | 24 | http://localhost:8000 25 | 26 | 27 | 28 | 29 | com.linkedin.drelephant.schedulers.AzkabanScheduler 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /test/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2016 LinkedIn Corp. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | # use this file except in compliance with the License. You may obtain a copy of 6 | # the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations under 14 | # the License. 15 | # 16 | 17 | #Define the root logger with appender file 18 | log4j.rootLogger = INFO, FA 19 | 20 | #File Appender 21 | log4j.appender.FA=org.apache.log4j.DailyRollingFileAppender 22 | log4j.appender.FA.File=dr_elephant.log 23 | log4j.appender.FA.layout=org.apache.log4j.PatternLayout 24 | log4j.appender.FA.layout.ConversionPattern=%d{MM-dd-yyyy HH:mm:ss} %-5p [%t] %c %x: %m%n 25 | log4j.appender.FA.DatePattern='.'yyyy-MM-dd 26 | log4j.appender.FA.ImmediateFlush=true 27 | log4j.appender.FA.Append=true 28 | -------------------------------------------------------------------------------- /test/resources/mapred-site.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | mapreduce.jobhistory.done-dir 23 | test/resources/history/done 24 | 25 | 26 | 27 | mapreduce.jobhistory.intermediate-done-dir 28 | test/resources/history/done_intermediate 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /test/resources/mrdata/mapperTaskCounter1.properties: -------------------------------------------------------------------------------- 1 | org.apache.hadoop.mapreduce.FileSystemCounter={FILE_LARGE_READ_OPS=0, FILE_WRITE_OPS=0, HDFS_READ_OPS=4, HDFS_BYTES_READ=268, HDFS_LARGE_READ_OPS=0, FILE_READ_OPS=0, FILE_BYTES_WRITTEN=117858, FILE_BYTES_READ=0, HDFS_WRITE_OPS=0, HDFS_BYTES_WRITTEN=0} 2 | org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter={BYTES_READ=118} 3 | org.apache.hadoop.mapreduce.TaskCounter={MAP_OUTPUT_MATERIALIZED_BYTES=28, SPILLED_RECORDS=2, MERGED_MAP_OUTPUTS=0, VIRTUAL_MEMORY_BYTES=0, MAP_INPUT_RECORDS=1, SPLIT_RAW_BYTES=150, FAILED_SHUFFLE=0, MAP_OUTPUT_BYTES=18, PHYSICAL_MEMORY_BYTES=0, GC_TIME_MILLIS=46, MAP_OUTPUT_RECORDS=2, COMBINE_INPUT_RECORDS=0, CPU_MILLISECONDS=0, COMMITTED_HEAP_BYTES=201326592} -------------------------------------------------------------------------------- /test/resources/mrdata/mapperTaskCounter2.properties: -------------------------------------------------------------------------------- 1 | org.apache.hadoop.mapreduce.FileSystemCounter={FILE_LARGE_READ_OPS=0, FILE_WRITE_OPS=0, HDFS_READ_OPS=4, HDFS_BYTES_READ=268, HDFS_LARGE_READ_OPS=0, FILE_READ_OPS=0, FILE_BYTES_WRITTEN=117858, FILE_BYTES_READ=0, HDFS_WRITE_OPS=0, HDFS_BYTES_WRITTEN=0} 2 | org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter={BYTES_READ=118} 3 | org.apache.hadoop.mapreduce.TaskCounter={MAP_OUTPUT_MATERIALIZED_BYTES=28, SPILLED_RECORDS=2, MERGED_MAP_OUTPUTS=0, VIRTUAL_MEMORY_BYTES=0, MAP_INPUT_RECORDS=1, SPLIT_RAW_BYTES=150, FAILED_SHUFFLE=0, MAP_OUTPUT_BYTES=18, PHYSICAL_MEMORY_BYTES=0, GC_TIME_MILLIS=46, MAP_OUTPUT_RECORDS=2, COMBINE_INPUT_RECORDS=0, CPU_MILLISECONDS=0, COMMITTED_HEAP_BYTES=201326592} -------------------------------------------------------------------------------- /test/resources/mrdata/mapperTaskCounter3.properties: -------------------------------------------------------------------------------- 1 | org.apache.hadoop.mapreduce.FileSystemCounter={FILE_LARGE_READ_OPS=0, FILE_WRITE_OPS=0, HDFS_READ_OPS=4, HDFS_BYTES_READ=268, HDFS_LARGE_READ_OPS=0, FILE_READ_OPS=0, FILE_BYTES_WRITTEN=117858, FILE_BYTES_READ=0, HDFS_WRITE_OPS=0, HDFS_BYTES_WRITTEN=0} 2 | org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter={BYTES_READ=118} 3 | org.apache.hadoop.mapreduce.TaskCounter={MAP_OUTPUT_MATERIALIZED_BYTES=28, SPILLED_RECORDS=2, MERGED_MAP_OUTPUTS=0, VIRTUAL_MEMORY_BYTES=0, MAP_INPUT_RECORDS=1, SPLIT_RAW_BYTES=150, FAILED_SHUFFLE=0, MAP_OUTPUT_BYTES=18, PHYSICAL_MEMORY_BYTES=0, GC_TIME_MILLIS=43, MAP_OUTPUT_RECORDS=2, COMBINE_INPUT_RECORDS=0, CPU_MILLISECONDS=0, COMMITTED_HEAP_BYTES=201326592} -------------------------------------------------------------------------------- /test/resources/mrdata/reducerTaskCounter1.properties: -------------------------------------------------------------------------------- 1 | org.apache.hadoop.mapreduce.FileSystemCounter={FILE_LARGE_READ_OPS=0, FILE_WRITE_OPS=0, HDFS_READ_OPS=3, HDFS_BYTES_READ=0, HDFS_LARGE_READ_OPS=0, FILE_READ_OPS=0, FILE_BYTES_WRITTEN=117847, FILE_BYTES_READ=72, HDFS_WRITE_OPS=3, HDFS_BYTES_WRITTEN=215} 2 | org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter={BYTES_WRITTEN=97} 3 | org.apache.hadoop.mapreduce.TaskCounter={REDUCE_INPUT_RECORDS=6, SPILLED_RECORDS=6, MERGED_MAP_OUTPUTS=3, VIRTUAL_MEMORY_BYTES=0, FAILED_SHUFFLE=0, REDUCE_SHUFFLE_BYTES=84, PHYSICAL_MEMORY_BYTES=0, GC_TIME_MILLIS=38, REDUCE_INPUT_GROUPS=2, COMBINE_OUTPUT_RECORDS=0, SHUFFLED_MAPS=3, REDUCE_OUTPUT_RECORDS=0, COMBINE_INPUT_RECORDS=0, CPU_MILLISECONDS=0, COMMITTED_HEAP_BYTES=147849216} 4 | Shuffle Errors={CONNECTION=0, WRONG_LENGTH=0, BAD_ID=0, WRONG_REDUCE=0, IO_ERROR=0, WRONG_MAP=0} -------------------------------------------------------------------------------- /test/resources/mrdata/sampleJobConf.properties: -------------------------------------------------------------------------------- 1 | azkaban.link.job.url=https://elephant.linkedin.com:8443/manager?project=b2-confirm-email-reminder&flow=reminder&job=overwriter-reminder2 2 | azkaban.link.attempt.url=https://elephant.linkedin.com:8443/executor?execid=1654676&job=overwriter-reminder2&attempt=0 3 | azkaban.link.workflow.url=https://elephant.linkedin.com:8443/manager?project=b2-confirm-email-reminder&flow=reminder 4 | azkaban.link.execution.url=https://elephant.linkedin.com:8443/executor?execid=1654676 5 | -------------------------------------------------------------------------------- /test/resources/mrdata/sampleJobCounter.properties: -------------------------------------------------------------------------------- 1 | org.apache.hadoop.mapreduce.FileSystemCounter={FILE_LARGE_READ_OPS=0, FILE_WRITE_OPS=0, HDFS_READ_OPS=15, HDFS_BYTES_READ=804, HDFS_LARGE_READ_OPS=0, FILE_READ_OPS=0, FILE_BYTES_WRITTEN=471421, FILE_BYTES_READ=72, HDFS_WRITE_OPS=3, HDFS_BYTES_WRITTEN=215} 2 | org.apache.hadoop.mapreduce.JobCounter={TOTAL_LAUNCHED_MAPS=3, VCORES_MILLIS_REDUCES=1870, MB_MILLIS_MAPS=7876608, TOTAL_LAUNCHED_REDUCES=1, SLOTS_MILLIS_REDUCES=1870, VCORES_MILLIS_MAPS=7692, MB_MILLIS_REDUCES=1914880, SLOTS_MILLIS_MAPS=7692, MILLIS_REDUCES=1870, MILLIS_MAPS=7692, DATA_LOCAL_MAPS=3} 3 | org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter={BYTES_WRITTEN=97} 4 | org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter={BYTES_READ=354} 5 | org.apache.hadoop.mapreduce.TaskCounter={MAP_OUTPUT_MATERIALIZED_BYTES=84, REDUCE_INPUT_RECORDS=6, SPILLED_RECORDS=12, MERGED_MAP_OUTPUTS=3, VIRTUAL_MEMORY_BYTES=0, MAP_INPUT_RECORDS=3, SPLIT_RAW_BYTES=450, FAILED_SHUFFLE=0, MAP_OUTPUT_BYTES=54, REDUCE_SHUFFLE_BYTES=84, PHYSICAL_MEMORY_BYTES=0, GC_TIME_MILLIS=173, REDUCE_INPUT_GROUPS=2, COMBINE_OUTPUT_RECORDS=0, SHUFFLED_MAPS=3, REDUCE_OUTPUT_RECORDS=0, MAP_OUTPUT_RECORDS=6, COMBINE_INPUT_RECORDS=0, CPU_MILLISECONDS=0, COMMITTED_HEAP_BYTES=751828992} 6 | Shuffle Errors={CONNECTION=0, WRONG_LENGTH=0, BAD_ID=0, WRONG_REDUCE=0, IO_ERROR=0, WRONG_MAP=0} -------------------------------------------------------------------------------- /test/resources/spark-defaults.conf: -------------------------------------------------------------------------------- 1 | spark.yarn.historyServer.address = jh1.grid.example.com:18080 2 | spark.eventLog.enabled = true 3 | spark.eventLog.compress = true 4 | spark.eventLog.dir = hdfs://nn1.grid.example.com:9000/logs/spark 5 | -------------------------------------------------------------------------------- /test/resources/spark_event_logs/event_log_2: -------------------------------------------------------------------------------- 1 | {"Event":"SparkListenerLogStart","Spark Version":"1.4.1"} 2 | {"Event":"SparkListenerBlockManagerAdded","Block Manager ID":{"Executor ID":"driver","Host":"127.0.0.1","Port":54157},"Maximum Memory":515411804,"Timestamp":1475761114342} 3 | {"Event":"SparkListenerEnvironmentUpdate","Spark Properties":{"spark.serializer":"org.apache.spark.serializer.KryoSerializer","spark.storage.memoryFraction":"0.3","spark.driver.memory":"2G","spark.executor.instances":"900","spark.executor.memory":"1g","spark.shuffle.memoryFraction":"0.5"},"JVM Information":{},"System Properties":{},"Classpath Entries":{}} 4 | {"Event":"SparkListenerApplicationStart","App Name":"app","App ID":"application_1","Timestamp":1475761112578,"User":"foo","App Attempt ID":"1"} 5 | -------------------------------------------------------------------------------- /web/app/adapters/application.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | import Ember from 'ember'; 19 | 20 | export default DS.JSONAPIAdapter.extend({ 21 | namespace: 'rest' 22 | }); 23 | 24 | export default DS.RESTAdapter.extend({ 25 | namespace: 'rest', 26 | pathForType: function (type) { 27 | return Ember.String.pluralize(type); 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /web/app/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | import Resolver from './resolver'; 19 | import loadInitializers from 'ember-load-initializers'; 20 | import config from './config/environment'; 21 | 22 | let App; 23 | 24 | Ember.MODEL_FACTORY_INJECTIONS = true; 25 | 26 | App = Ember.Application.extend({ 27 | modulePrefix: config.modulePrefix, 28 | podModulePrefix: config.podModulePrefix, 29 | Resolver 30 | }); 31 | 32 | loadInitializers(App, config.modulePrefix); 33 | 34 | export default App; 35 | -------------------------------------------------------------------------------- /web/app/components/heuristic-details-list.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Component.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/components/loading-panel.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Component.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/components/map-reduce-exception.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Component.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/components/single-heuristic-detail.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Component.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/components/single-tab.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Copyright 2016 LinkedIn Corp. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | * use this file except in compliance with the License. You may obtain a copy of 7 | * the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | * License for the specific language governing permissions and limitations under 15 | * the License. 16 | */ 17 | 18 | import Ember from 'ember'; 19 | 20 | export default Ember.Component.extend({ 21 | }); 22 | -------------------------------------------------------------------------------- /web/app/components/user-tabs.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Component.extend({ 20 | newUser: null, // this is binded to the text box for adding user 21 | showInputBox: false, 22 | actions: { 23 | 24 | /** 25 | * sets showInputBox to true to show the input box 26 | */ 27 | showInput() { 28 | this.set("showInputBox", true); 29 | }, 30 | 31 | /** 32 | * sets showInputBox to false to hide the input box 33 | */ 34 | resetInput() { 35 | this.set("showInputBox", false); 36 | } 37 | } 38 | }); 39 | -------------------------------------------------------------------------------- /web/app/components/user-tags.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Component.extend({ 20 | showInputBox: false, 21 | actions: { 22 | 23 | /** 24 | * sets showInputBox to true to show the input box 25 | */ 26 | showInput() { 27 | this.set("showInputBox", true); 28 | }, 29 | 30 | /** 31 | * sets showInputBox to false to hide the input box 32 | */ 33 | resetInput() { 34 | this.set("showInputBox", false); 35 | } 36 | } 37 | }); 38 | -------------------------------------------------------------------------------- /web/app/controllers/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Controller.extend({ 20 | queryParams: ['applicationid'], 21 | applicationid: null 22 | }); 23 | -------------------------------------------------------------------------------- /web/app/controllers/job.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Controller.extend({ 20 | queryParams: ['jobid'], 21 | jobid: null 22 | }); 23 | -------------------------------------------------------------------------------- /web/app/controllers/not-found.js: -------------------------------------------------------------------------------- 1 | import Ember from 'ember'; 2 | 3 | export default Ember.Controller.extend({ 4 | queryParams: ['previous'], 5 | previous: null, 6 | }); 7 | -------------------------------------------------------------------------------- /web/app/controllers/workflow.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Controller.extend({ 20 | queryParams: ['workflowid'], 21 | workflowid: null, 22 | }); 23 | -------------------------------------------------------------------------------- /web/app/helpers/eq.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | /** 20 | * helper takes two parameters and returns true if both are equal else returns false 21 | * @param params The parameters for the helper 22 | * @returns {boolean} 23 | */ 24 | export function eq(params) { 25 | if (params[0] === params[1]) { 26 | return true; 27 | } 28 | return false; 29 | } 30 | 31 | export default Ember.Helper.helper(eq); 32 | -------------------------------------------------------------------------------- /web/app/helpers/get-bootstrap-severity-code.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | /** Map to convert serverity to bootstrap class **/ 20 | const SEVERITY_TO_BOOTSTRAP_MAP = { 21 | critical: "danger", 22 | severe: "severe", 23 | moderate: "warning", 24 | low: "success", 25 | none:"success" 26 | }; 27 | 28 | /** 29 | * This helper takes the serverity as the parameter value and returns the corresponding bootstrap code 30 | * @param params The parameters 31 | * @returns one of {"danger","severe","warning","success"} 32 | */ 33 | export function getBootstrapSeverityCode(params) { 34 | let [severity] = params; 35 | if (severity == null) { 36 | return SEVERITY_TO_BOOTSTRAP_MAP.none; 37 | } 38 | return SEVERITY_TO_BOOTSTRAP_MAP[severity.toLowerCase()]; 39 | } 40 | 41 | export default Ember.Helper.helper(getBootstrapSeverityCode); 42 | -------------------------------------------------------------------------------- /web/app/helpers/get-color-for-severity.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | 20 | /** Map to convert severity to color **/ 21 | const SEVERITY_TO_COLOR_CODE_MAP = { 22 | critical: "#D9534F", 23 | severe: "#E4804E", 24 | moderate: "#F0AD4E", 25 | low: "#5CB85C", 26 | none:"#5CB85C" 27 | }; 28 | 29 | /** 30 | * Returns the color based on the severity 31 | * @param params The severity value 32 | * @returns The color based on the serverity 33 | */ 34 | export function getColorForSeverity(params) { 35 | let [severity] = params; 36 | if(severity==null) { 37 | return SEVERITY_TO_COLOR_CODE_MAP.none; 38 | } 39 | return SEVERITY_TO_COLOR_CODE_MAP[severity.toLowerCase()]; 40 | } 41 | 42 | export default Ember.Helper.helper(getColorForSeverity); 43 | -------------------------------------------------------------------------------- /web/app/helpers/get-date.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | /** 20 | * Returns the date from milliseconds 21 | * @param params The date to convert 22 | * @returns The converted date 23 | */ 24 | export function getDate(params) { 25 | let [date] = params; 26 | return new Date(date); 27 | } 28 | 29 | export default Ember.Helper.helper(getDate); 30 | -------------------------------------------------------------------------------- /web/app/helpers/get-percentage.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | /** 20 | * Calculates the percentage given two params 21 | * @param params The arguments for percentage 22 | * @returns The percentage in the form PP.PP% 23 | */ 24 | export function getPercentage(params) { 25 | let [arg1, arg2] = params; 26 | if(Number(arg2)===0) { 27 | return "0%"; 28 | } 29 | 30 | var percentage = ( arg1 / arg2 ) * 100; 31 | var percentString = percentage.toFixed(2).toString()+ "%"; 32 | return percentString; 33 | } 34 | 35 | export default Ember.Helper.helper(getPercentage); 36 | -------------------------------------------------------------------------------- /web/app/helpers/get-resource-in-gb-hours-value.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | const mbs_in_one_gb = 1024; 19 | const seconds_in_one_hour = 3600; 20 | export function getResourceInGbHoursValue(params/*, hash*/) { 21 | let [MBSeconds] = params; 22 | if (MBSeconds == 0) { 23 | return "0 GB Hours"; 24 | } 25 | 26 | var GBseconds = MBSeconds/mbs_in_one_gb; 27 | var GBHours = GBseconds / seconds_in_one_hour; 28 | 29 | if ((GBHours * 1000).toFixed(0) == 0) { 30 | return "0 GB Hours"; 31 | } 32 | 33 | var GBHoursString = GBHours.toFixed(3).toString(); 34 | return GBHoursString; 35 | } 36 | 37 | export default Ember.Helper.helper(getResourceInGbHoursValue); 38 | -------------------------------------------------------------------------------- /web/app/helpers/get-resource-in-gbhours.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | const mbs_in_one_gb = 1024; 20 | const seconds_in_one_hour = 3600; 21 | 22 | /** 23 | * Returns the resource after converting to GB Hours 24 | * @param params The resource in MB Seconds 25 | * @returns Resource in GB Hours 26 | */ 27 | export function getResourceInGBHours(params) { 28 | let [MBSeconds] = params; 29 | if (MBSeconds == 0) { 30 | return "0 GB Hours"; 31 | } 32 | 33 | var GBseconds = MBSeconds/mbs_in_one_gb; 34 | var GBHours = GBseconds / seconds_in_one_hour; 35 | 36 | if ((GBHours * 1000).toFixed(0) == 0) { 37 | return "0 GB Hours"; 38 | } 39 | 40 | var GBHoursString = GBHours.toFixed(3).toString(); 41 | GBHoursString = GBHoursString + " GB Hours"; 42 | return GBHoursString; 43 | } 44 | 45 | export default Ember.Helper.helper(getResourceInGBHours); 46 | -------------------------------------------------------------------------------- /web/app/helpers/gt.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export function gt(params) { 20 | let[first,second] = params; 21 | return first>second; 22 | } 23 | 24 | export default Ember.Helper.helper(gt); 25 | -------------------------------------------------------------------------------- /web/app/helpers/not-empty.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | /** 20 | * Checks if a given string is empty 21 | * @param params 22 | * @returns {boolean} 23 | */ 24 | export function notEmpty(params) { 25 | let [id] = params; 26 | if(id=="" || id==null) { 27 | return false; 28 | } 29 | return true; 30 | } 31 | 32 | export default Ember.Helper.helper(notEmpty); 33 | -------------------------------------------------------------------------------- /web/app/helpers/url-encode.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | /** 20 | * Encodes a url 21 | * @param params The url to encode 22 | * @returns The encoded url 23 | */ 24 | export function urlEncode(params) { 25 | let [uri] = params; 26 | return encodeURIComponent(uri); 27 | } 28 | 29 | export default Ember.Helper.helper(urlEncode); 30 | -------------------------------------------------------------------------------- /web/app/index.html: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | DrElephant 23 | 24 | 25 | 26 | {{content-for "head"}} 27 | 28 | 29 | 30 | 31 | {{content-for "head-footer"}} 32 | 33 | 34 | {{content-for "body"}} 35 | 36 | 37 | 38 | 39 | {{content-for "body-footer"}} 40 | 41 | 42 | -------------------------------------------------------------------------------- /web/app/initializers/component-router-injector.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | export function initialize(application) { 18 | // Injects all Ember components with a router object: 19 | application.inject('component', 'router', 'router:main'); 20 | } 21 | 22 | export default { 23 | name: 'component-router-injector', 24 | initialize: initialize 25 | }; 26 | -------------------------------------------------------------------------------- /web/app/initializers/notification-injector.js: -------------------------------------------------------------------------------- 1 | export function initialize(application) { 2 | application.inject('controller', 'notifications', 'service:notification-messages'); 3 | } 4 | 5 | export default { 6 | name: 'inject-notifications', 7 | initialize: initialize 8 | }; 9 | -------------------------------------------------------------------------------- /web/app/models/application-summary.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.Model.extend({ 20 | username: DS.attr("string"), 21 | starttime: DS.attr("date"), 22 | finishtime: DS.attr("date"), 23 | runtime: DS.attr("string"), 24 | waittime: DS.attr("string"), 25 | resourceused: DS.attr("string"), 26 | resourcewasted: DS.attr("string"), 27 | severity: DS.attr("string"), 28 | heuristicsummary: DS.attr(), 29 | jobname: DS.attr("string") 30 | }); 31 | 32 | -------------------------------------------------------------------------------- /web/app/models/application.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.Model.extend({ 20 | username: DS.attr('string'), 21 | jobtype: DS.attr('string'), 22 | mapreducejobname: DS.attr('string'), 23 | starttime: DS.attr('date'), 24 | finishtime: DS.attr('date'), 25 | runtime: DS.attr('string'), 26 | waittime: DS.attr('string'), 27 | resourceused: DS.attr('string'), 28 | resourcewasted: DS.attr('string'), 29 | severity: DS.attr('string'), 30 | trackingurl : DS.attr('string'), 31 | jobexecid: DS.attr('string'), 32 | jobdefid: DS.attr('string'), 33 | flowexecid: DS.attr('string'), 34 | flowdefid: DS.attr('string'), 35 | yarnappheuristicresults: DS.attr(), 36 | queue: DS.attr("string") 37 | }); 38 | -------------------------------------------------------------------------------- /web/app/models/dashboard-summary.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.Model.extend({ 20 | total: DS.attr("string"), 21 | critical: DS.attr("string"), 22 | severe: DS.attr("string"), 23 | moderate: DS.attr("string"), 24 | low: DS.attr("string"), 25 | none: DS.attr("string") 26 | }); 27 | -------------------------------------------------------------------------------- /web/app/models/exception-status.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.Model.extend({ 20 | exceptionenabled: DS.attr("string"), 21 | schedulers: DS.attr() 22 | }); 23 | -------------------------------------------------------------------------------- /web/app/models/search-option.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.Model.extend({ 20 | jobcategory: DS.attr(), 21 | severities: DS.attr() 22 | }); 23 | -------------------------------------------------------------------------------- /web/app/models/search-result.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.Model.extend({ 20 | start: DS.attr(), 21 | end: DS.attr(), 22 | total: DS.attr(), 23 | summaries: DS.attr() 24 | }); 25 | -------------------------------------------------------------------------------- /web/app/models/user-detail.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.Model.extend({ 20 | totalapplications: DS.attr("string"), 21 | totalworkflows: DS.attr("string"), 22 | totaljobs: DS.attr("string"), 23 | resourceused: DS.attr("string"), 24 | resourcewasted: DS.attr("string"), 25 | runtime: DS.attr("string"), 26 | waittime: DS.attr("string"), 27 | summaries: DS.attr(), 28 | total: DS.attr(), 29 | start: DS.attr(), 30 | end: DS.attr() 31 | }); 32 | -------------------------------------------------------------------------------- /web/app/models/workflow-exception.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.Model.extend({ 20 | name: DS.attr("string"), 21 | type: DS.attr("string"), 22 | applications: DS.attr(), 23 | status: DS.attr("string"), 24 | exceptionSummary: DS.attr("string") 25 | }); 26 | -------------------------------------------------------------------------------- /web/app/models/workflow-summary.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | import Scheduler from 'dr-elephant/utils/scheduler'; 19 | 20 | export default DS.Model.extend({ 21 | username: DS.attr("string"), 22 | starttime: DS.attr("date"), 23 | finishtime: DS.attr("date"), 24 | runtime: DS.attr("string"), 25 | waittime: DS.attr("string"), 26 | resourceused: DS.attr("string"), 27 | resourcewasted: DS.attr("string"), 28 | severity: DS.attr("string"), 29 | jobsseverity: DS.attr(), 30 | queue: DS.attr("string"), 31 | scheduler: DS.attr("string"), 32 | flowdefid: DS.attr("string"), 33 | flowexecid: DS.attr("string"), 34 | flowname: Ember.computed('flowdefid', 'flowexecid', 'scheduler', function () { 35 | var scheduler = new Scheduler(); 36 | return scheduler.getFlowName(this.get('flowexecid'), this.get('flowdefid'), this.get('scheduler')); 37 | }) 38 | }); 39 | -------------------------------------------------------------------------------- /web/app/resolver.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Resolver from 'ember-resolver'; 18 | 19 | export default Resolver; 20 | -------------------------------------------------------------------------------- /web/app/routes/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Route.extend({ 20 | 21 | beforeModel: function (transition) { 22 | this.applicationid = transition.queryParams.applicationid; 23 | }, 24 | 25 | model(){ 26 | this.applications = this.store.queryRecord('application', {applicationid: this.get("applicationid")}); 27 | return this.applications; 28 | }, 29 | actions: { 30 | error(error, transition) { 31 | if (error.errors[0].status == 404) { 32 | return this.transitionTo('not-found', { queryParams: {'previous': window.location.href}}); 33 | } 34 | } 35 | } 36 | }); 37 | -------------------------------------------------------------------------------- /web/app/routes/dashboard.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Route.extend({ 20 | afterModel() { 21 | this.transitionTo('dashboard.workflow'); 22 | }, 23 | model(){ 24 | this.dashboardSummary = this.store.queryRecord('dashboard-summary',{}); 25 | return this.dashboardSummary; 26 | } 27 | }); 28 | -------------------------------------------------------------------------------- /web/app/routes/dashboard/job.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | import Users from 'dr-elephant/models/users'; 19 | 20 | export default Ember.Route.extend({ 21 | users: new Users(), 22 | beforeModel(){ 23 | this.usernames = this.users.getUsernames(); 24 | this.set('usernames',this.users.getUsernames()); 25 | }, 26 | model(){ 27 | /** Do not load jobs here, jobs will be loaded in afterModel **/ 28 | return Ember.RSVP.hash({ 29 | usernames: this.users.getUsernames(), 30 | jobs: {} 31 | }); 32 | }, 33 | afterModel() { 34 | /** once the page is rendered, click on the current user tab **/ 35 | Ember.run.scheduleOnce('afterRender', this, function() { 36 | if(this.users.getActiveUser()==null) { 37 | Ember.$("#all a").trigger("click"); 38 | } else { 39 | Ember.$("#" + this.users.getActiveUser()).trigger("click"); 40 | } 41 | }); 42 | } 43 | }); 44 | -------------------------------------------------------------------------------- /web/app/routes/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Route.extend({ 20 | beforeModel() { 21 | this.transitionTo('dashboard.workflow'); 22 | } 23 | }); 24 | -------------------------------------------------------------------------------- /web/app/routes/job.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Route.extend({ 20 | beforeModel: function (transition) { 21 | this.jobid = transition.queryParams.jobid; 22 | }, 23 | model(){ 24 | this.jobs = this.store.queryRecord('job', {jobid: this.get("jobid")}); 25 | return this.jobs; 26 | }, 27 | actions: { 28 | error(error, transition) { 29 | if (error.errors[0].status == 404) { 30 | return this.transitionTo('not-found', { queryParams: {'previous': window.location.href}}); 31 | } 32 | } 33 | } 34 | }); 35 | -------------------------------------------------------------------------------- /web/app/routes/not-found.js: -------------------------------------------------------------------------------- 1 | import Ember from 'ember'; 2 | 3 | export default Ember.Route.extend({ 4 | 5 | }); 6 | -------------------------------------------------------------------------------- /web/app/routes/work-in-progress.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default Ember.Route.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/serializers/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.RESTSerializer.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/serializers/application-summary.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.RESTSerializer.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/serializers/application.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.RESTSerializer.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/serializers/job-summary.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.RESTSerializer.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/serializers/job.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.RESTSerializer.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/serializers/workflow-summary.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.RESTSerializer.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/serializers/workflow.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import DS from 'ember-data'; 18 | 19 | export default DS.RESTSerializer.extend({ 20 | }); 21 | -------------------------------------------------------------------------------- /web/app/styles/partials/aggregated-metrics.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | .aggregated-metrics-block { 18 | font-size: 13px; 19 | color: #5e6365; 20 | font-family: 'Shift', sans-serif; 21 | padding-left: 10px; 22 | } 23 | 24 | .usedmemory-td { 25 | width: 175px; 26 | } 27 | 28 | .wastedmemory-td { 29 | width: 100px 30 | } 31 | 32 | .runtime-td { 33 | width: 120px; 34 | } 35 | 36 | .waittime-td { 37 | width: 100px; 38 | } 39 | 40 | -------------------------------------------------------------------------------- /web/app/styles/partials/application-menu.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | /** Dashboard menu **/ 18 | .menu-workflow { 19 | width: 100%; 20 | } 21 | 22 | .wf-button { 23 | background-color: white; /* Green */ 24 | display: inline-block; 25 | cursor: pointer; 26 | border-radius: 3px; 27 | font-size: 14px; 28 | font-weight: 500; 29 | border: #0084BF 1px solid; 30 | color: #0084BF; 31 | } 32 | 33 | .wf-button:hover { 34 | background-color: #008cc9; 35 | color: white; 36 | } 37 | 38 | .menu-workflow > .active { 39 | background-color: #008cc9; 40 | color: white; 41 | opacity: 0.7; 42 | border: 1px #008cc9 solid; 43 | box-shadow: none; 44 | } 45 | -------------------------------------------------------------------------------- /web/app/styles/partials/application.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | body { 18 | background: #E7E9EC !important; /* Adding !important forces the browser to overwrite the default style applied by Bootstrap */ 19 | } 20 | -------------------------------------------------------------------------------- /web/app/styles/partials/heuristic-detail.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | .heuristic-item:hover { 18 | background: grey; 19 | } 20 | 21 | .heuristic-detail-table { 22 | width: 100%; 23 | margin: 10px 20px 10px 20px; 24 | } 25 | 26 | .heuristic-detail-table td { 27 | width: 50%; 28 | } 29 | -------------------------------------------------------------------------------- /web/app/styles/partials/jobs-severity.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | /** 18 | jobs severity 19 | **/ 20 | 21 | .horizontal-list { 22 | margin: 0; 23 | padding: 0; 24 | list-style-type: none; 25 | } 26 | 27 | .horizontal-list li { 28 | float: left; 29 | } 30 | 31 | .scnd-font-color { 32 | color: #9099b7; 33 | } 34 | 35 | /** severity text **/ 36 | 37 | .severity-horizontal-list li { 38 | width: 75px; 39 | border: none; 40 | text-align: center; 41 | } 42 | 43 | .severity-text { 44 | margin: 0; 45 | padding: 0px 0 5px; 46 | font-size: 12px; 47 | } 48 | 49 | .severity-count { 50 | margin: 0; 51 | padding: 0 0 0px 0px; 52 | font-size: 20px; 53 | } 54 | 55 | .job-severity-block { 56 | padding-bottom: 5px; 57 | } 58 | -------------------------------------------------------------------------------- /web/app/styles/partials/loading-panel.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | .loading-panel-div { 18 | background: white; width: 100%;height: 800px; opacity: 0.5; 19 | } 20 | 21 | .loading-image { 22 | margin: auto; display: block; padding-top: 200px; 23 | } 24 | -------------------------------------------------------------------------------- /web/app/styles/partials/not-found.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | .not-found-container { 18 | margin-left: 100px; 19 | margin-top: 100px; 20 | margin-bottom: 100px; 21 | } -------------------------------------------------------------------------------- /web/app/styles/partials/search-panel.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | .search-component { 18 | height: 35px; 19 | margin: 0px; 20 | } 21 | -------------------------------------------------------------------------------- /web/app/styles/partials/user-tags.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | .user-tags { 18 | margin: 10px 10px 10px 10px; 19 | padding: 5px 5px 5px 5px; 20 | } 21 | 22 | .tag-list { 23 | margin-right: 10px; 24 | padding:10px; 25 | } -------------------------------------------------------------------------------- /web/app/templates/components/application-list.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | {{#each applications as |application|}} 20 | {{single-application application=application}} 21 | {{/each}} -------------------------------------------------------------------------------- /web/app/templates/components/flow-list.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | {{#each workflows as |flow|}} 20 | {{single-flow flow=flow}} 21 | {{/each}} -------------------------------------------------------------------------------- /web/app/templates/components/heuristic-details-list.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | {{#each heuristic-details as |yarnappheuristicresult|}} 20 | {{single-heuristic-detail yarnappheuristicresult=yarnappheuristicresult}} 21 | {{/each}} -------------------------------------------------------------------------------- /web/app/templates/components/heuristics-summary.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | {{#each heuristics as |heuristic|}} 20 |
{{heuristic.name}}
21 | {{/each}} 22 | -------------------------------------------------------------------------------- /web/app/templates/components/job-list.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | {{#each jobs as |job|}} 20 | {{single-job job=job}} 21 | {{/each}} -------------------------------------------------------------------------------- /web/app/templates/components/jobs-severity.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 |
    20 | {{#each jobsseverity as |severity|}} 21 |
  • 22 |

    {{severity.count}}

    23 |

    {{severity.severity}}

    24 |
  • 25 | {{/each}} 26 |
-------------------------------------------------------------------------------- /web/app/templates/components/loading-panel.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 |
20 | 21 |

{{message}}

22 |
-------------------------------------------------------------------------------- /web/app/templates/components/paging-panel.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | -------------------------------------------------------------------------------- /web/app/templates/components/single-tab.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | -------------------------------------------------------------------------------- /web/app/templates/components/tasks-severity.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 |
    20 | {{#each tasksseverity as |severity|}} 21 |
  • 22 |

    {{severity.count}}

    23 |

    {{severity.severity}}

    24 |
  • 25 | {{/each}} 26 |
-------------------------------------------------------------------------------- /web/app/templates/components/user-tags.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 |
20 | 35 |
-------------------------------------------------------------------------------- /web/app/templates/dashboard/app.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | {{!-- The user tabs. Tabs can be added and deleted --}} 20 | {{user-tabs deleteTab=(action "deleteTab") setTab=(action "changeTab") addTab=(action "addTab") usernames=model.usernames}} 21 | {{#if loading}} 22 | {{loading-panel message="loading applications... "}} 23 | {{else}} 24 | {{application-list applications=model.applications}} 25 | {{/if}} 26 | -------------------------------------------------------------------------------- /web/app/templates/dashboard/job.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | {{!-- The user tabs. Tabs can be added and deleted --}} 20 | {{user-tabs deleteTab=(action "deleteTab") setTab=(action "changeTab") addTab=(action "addTab") usernames=model.usernames}} 21 | {{#if loading}} 22 | {{loading-panel message="loading jobs..."}} 23 | {{else}} 24 | {{job-list jobs=model.jobs}} 25 | {{/if}} -------------------------------------------------------------------------------- /web/app/templates/dashboard/workflow.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | {{!-- The user tabs. Tabs can be added and deleted --}} 20 | {{user-tabs deleteTab=(action "deleteTab") setTab=(action "changeTab") addTab=(action "addTab") usernames=model.usernames showInputBox=showInputBox}} 21 | 22 | {{!-- The list of flows of the user --}} 23 | {{#if loading}} 24 | {{loading-panel message="loading flows..."}} 25 | {{else}} 26 | {{flow-list workflows=model.workflows}} 27 | {{/if}} 28 | -------------------------------------------------------------------------------- /web/app/templates/loading.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | 20 | 21 |
22 |
23 | 24 |

loading...

25 |
26 |
27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /web/app/templates/not-found.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | 20 |
21 | 41 |
42 | -------------------------------------------------------------------------------- /web/app/templates/work-in-progress.hbs: -------------------------------------------------------------------------------- 1 | {{!-- 2 | 3 | Copyright 2016 LinkedIn Corp. 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 | use this file except in compliance with the License. You may obtain a copy of 7 | the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | License for the specific language governing permissions and limitations under 15 | the License. 16 | 17 | --}} 18 | 19 | 20 |
21 | 42 |
-------------------------------------------------------------------------------- /web/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dr-elephant", 3 | "dependencies": { 4 | "ember": "2.6.2", 5 | "ember-cli-shims": "0.1.1", 6 | "ember-cli-test-loader": "0.2.2", 7 | "ember-qunit-notifications": "0.1.0", 8 | "bootstrap": "3.3.7", 9 | "d3": "4.2.6", 10 | "bootstrap-datepicker": "^1.6.4" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/assets/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/web/public/assets/images/loading.gif -------------------------------------------------------------------------------- /web/public/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/web/public/assets/images/logo.png -------------------------------------------------------------------------------- /web/public/assets/images/runtime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/web/public/assets/images/runtime.png -------------------------------------------------------------------------------- /web/public/assets/images/usedmemory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/web/public/assets/images/usedmemory.png -------------------------------------------------------------------------------- /web/public/assets/images/waittime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/web/public/assets/images/waittime.png -------------------------------------------------------------------------------- /web/public/assets/images/wastedmemory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linkedin/dr-elephant/916c25d5845f534ec2648fe17d978cd48a8bd284/web/public/assets/images/wastedmemory.png -------------------------------------------------------------------------------- /web/testem.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | /*jshint node:true*/ 18 | module.exports = { 19 | "framework": "qunit", 20 | "test_page": "tests/index.html?hidepassed", 21 | "disable_watching": true, 22 | "launch_in_ci": [ 23 | "PhantomJS" 24 | ], 25 | "launch_in_dev": [ 26 | "PhantomJS", 27 | "Chrome" 28 | ] 29 | }; 30 | -------------------------------------------------------------------------------- /web/tests/helpers/destroy-app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | 19 | export default function destroyApp(application) { 20 | Ember.run(application, 'destroy'); 21 | } 22 | -------------------------------------------------------------------------------- /web/tests/helpers/module-for-acceptance.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { module } from 'qunit'; 18 | import Ember from 'ember'; 19 | import startApp from '../helpers/start-app'; 20 | import destroyApp from '../helpers/destroy-app'; 21 | 22 | const { RSVP: { Promise } } = Ember; 23 | 24 | export default function(name, options = {}) { 25 | module(name, { 26 | beforeEach() { 27 | this.application = startApp(); 28 | 29 | if (options.beforeEach) { 30 | return options.beforeEach.apply(this, arguments); 31 | } 32 | }, 33 | 34 | afterEach() { 35 | let afterEach = options.afterEach && options.afterEach.apply(this, arguments); 36 | return Promise.resolve(afterEach).then(() => destroyApp(this.application)); 37 | } 38 | }); 39 | } 40 | -------------------------------------------------------------------------------- /web/tests/helpers/resolver.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Resolver from '../../resolver'; 18 | import config from '../../config/environment'; 19 | 20 | const resolver = Resolver.create(); 21 | 22 | resolver.namespace = { 23 | modulePrefix: config.modulePrefix, 24 | podModulePrefix: config.podModulePrefix 25 | }; 26 | 27 | export default resolver; 28 | -------------------------------------------------------------------------------- /web/tests/helpers/start-app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import Ember from 'ember'; 18 | import Application from '../../app'; 19 | import config from '../../config/environment'; 20 | 21 | export default function startApp(attrs) { 22 | let application; 23 | 24 | let attributes = Ember.merge({}, config.APP); 25 | attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; 26 | 27 | Ember.run(() => { 28 | application = Application.create(attributes); 29 | application.setupForTesting(); 30 | application.injectTestHelpers(); 31 | }); 32 | 33 | return application; 34 | } 35 | -------------------------------------------------------------------------------- /web/tests/integration/components/jobs-severity-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { moduleForComponent, test } from 'ember-qunit'; 18 | import hbs from 'htmlbars-inline-precompile'; 19 | 20 | moduleForComponent('jobs-severity', 'Integration | Component | jobs severity', { 21 | integration: true 22 | }); 23 | 24 | test('Tests for the job severity component', function(assert) { 25 | 26 | this.set("jobsseverity", [ 27 | { 28 | severity: "Severe", 29 | count: 1 30 | }, 31 | { 32 | severity: "Moderate", 33 | count: 2 34 | }, 35 | { 36 | severity: "Critical", 37 | count: 1 38 | } 39 | ]); 40 | this.render(hbs`{{jobs-severity jobsseverity=jobsseverity}}`); 41 | 42 | assert.equal(this.$('#job_severities').text().trim().split("\n").join("").replace(/ /g, ''), '1Severe2Moderate1Critical'); 43 | 44 | }); 45 | -------------------------------------------------------------------------------- /web/tests/integration/components/single-tab-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { moduleForComponent, test } from 'ember-qunit'; 18 | import hbs from 'htmlbars-inline-precompile'; 19 | 20 | moduleForComponent('single-tab', 'Integration | Component | single tab', { 21 | integration: true 22 | }); 23 | 24 | test('Test for single-tab component', function(assert) { 25 | 26 | this.set("name","user1"); 27 | this.render(hbs`{{single-tab name=name}}`); 28 | assert.equal(this.$().text().trim(), 'user1'); 29 | 30 | this.set("name",""); 31 | this.render(hbs`{{single-tab name=name}}`); 32 | assert.equal(this.$().text().trim(), ''); 33 | 34 | 35 | this.set("name","all"); 36 | this.render(hbs`{{single-tab name=name}}`); 37 | assert.equal(this.$().text().trim(), 'all'); 38 | 39 | }); 40 | -------------------------------------------------------------------------------- /web/tests/test-helper.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import resolver from './helpers/resolver'; 18 | import { 19 | setResolver 20 | } from 'ember-qunit'; 21 | 22 | setResolver(resolver); 23 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/eq-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { eq } from 'dr-elephant/helpers/eq'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | eq'); 21 | 22 | test('Test for eq helper', function(assert) { 23 | let result = eq([100,100]); 24 | assert.ok(result); 25 | result = eq([10,100]); 26 | assert.ok(!result); 27 | result = eq(["100","100"]); 28 | assert.ok(result); 29 | result = eq(["100","10"]); 30 | assert.ok(!result); 31 | result = eq(["100",100]); 32 | assert.ok(!result); 33 | result = eq([100.00,100.00]); 34 | assert.ok(result); 35 | result = eq([100.0,100.1]); 36 | assert.ok(!result); 37 | }); 38 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/get-bootstrap-severity-code-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { getBootstrapSeverityCode } from 'dr-elephant/helpers/get-bootstrap-severity-code'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | get bootstrap severity code'); 21 | 22 | test('Test for getBootstrapSeverityCode helper', function(assert) { 23 | let result = getBootstrapSeverityCode(["critical"]); 24 | assert.equal("danger",result); 25 | result = getBootstrapSeverityCode(["severe"]); 26 | assert.equal("severe",result); 27 | result = getBootstrapSeverityCode(["moderate"]); 28 | assert.equal("warning",result); 29 | result = getBootstrapSeverityCode(["low"]); 30 | assert.equal("success",result); 31 | result = getBootstrapSeverityCode(["none"]); 32 | assert.equal("success",result); 33 | }); 34 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/get-color-for-severity-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { getColorForSeverity } from 'dr-elephant/helpers/get-color-for-severity'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | get color for severity'); 21 | 22 | test('Test for getColorForSeverity helper', function(assert) { 23 | let result = getColorForSeverity(["critical"]); 24 | assert.equal(result,"#D9534F"); 25 | result = getColorForSeverity(["severe"]); 26 | assert.equal(result,"#E4804E"); 27 | result = getColorForSeverity(["moderate"]); 28 | assert.equal(result,"#F0AD4E"); 29 | result = getColorForSeverity(["low"]); 30 | assert.equal(result,"#5CB85C"); 31 | result = getColorForSeverity(["none"]); 32 | assert.equal(result,"#5CB85C"); 33 | }); 34 | 35 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/get-date-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { getDate } from 'dr-elephant/helpers/get-date'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | get date'); 21 | 22 | test('test for getDate helper', function(assert) { 23 | let result = getDate([42]); 24 | assert.ok(result); 25 | }); 26 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/get-duration-breakdown-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { getDurationBreakdown } from 'dr-elephant/helpers/get-duration-breakdown'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | get duration breakdown'); 21 | 22 | test('Test for getDurationBreakdown helper', function(assert) { 23 | let result = getDurationBreakdown([10000000]); 24 | assert.equal(result,"02:46:40"); 25 | result = getDurationBreakdown([0]); 26 | assert.equal(result,"00:00:00"); 27 | result = getDurationBreakdown([1]); 28 | assert.equal(result,"00:00:00"); 29 | result = getDurationBreakdown([1000]); 30 | assert.equal(result,"00:00:01"); 31 | result = getDurationBreakdown([3600000]); 32 | assert.equal(result,"01:00:00"); 33 | result = getDurationBreakdown([60000]); 34 | assert.equal(result,"00:01:00"); 35 | }); 36 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/get-percentage-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { getPercentage } from 'dr-elephant/helpers/get-percentage'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | get percentage'); 21 | 22 | test('Test for getPercentage helper', function(assert) { 23 | let result = getPercentage([5,200]); 24 | assert.equal(result,"2.50%"); 25 | result = getPercentage([50,200]); 26 | assert.equal(result,"25.00%"); 27 | result = getPercentage([0,100]); 28 | assert.equal(result,"0.00%"); 29 | result = getPercentage([100,100]); 30 | assert.equal(result,"100.00%"); 31 | result = getPercentage([0,0]); 32 | assert.equal(result,"0%"); 33 | result = getPercentage([1,20]); 34 | assert.equal(result,"5.00%"); 35 | result = getPercentage([100,20]); 36 | assert.equal(result,"500.00%"); 37 | }); 38 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/get-resource-in-gbhours-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { getResourceInGBHours } from 'dr-elephant/helpers/get-resource-in-gbhours'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | get resource in gbhours'); 21 | 22 | test('Test for getResourceInGBHours helper', function(assert) { 23 | let result = getResourceInGBHours([100001010]); 24 | assert.equal(result,"27.127 GB Hours"); 25 | result = getResourceInGBHours([0]); 26 | assert.equal(result,"0 GB Hours"); 27 | result = getResourceInGBHours([100]); 28 | assert.equal(result,"0 GB Hours"); 29 | result = getResourceInGBHours([-1]); 30 | assert.equal(result,"0 GB Hours"); 31 | result = getResourceInGBHours([33]); 32 | assert.equal(result,"0 GB Hours"); 33 | result = getResourceInGBHours([3080328048302480]); 34 | assert.equal(result,"835592461.020 GB Hours"); 35 | }); 36 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/gt-test.js: -------------------------------------------------------------------------------- 1 | 2 | import { gt } from 'dr-elephant/helpers/gt'; 3 | import { module, test } from 'qunit'; 4 | 5 | module('Unit | Helper | gt'); 6 | 7 | // Replace this with your real tests. 8 | test('it works', function(assert) { 9 | let result = gt([42,30]); 10 | assert.ok(result); 11 | result = gt([30,42]) 12 | assert.ok(!result); 13 | result = gt([-1,30]); 14 | assert.ok(!result); 15 | result = gt([30,-1]); 16 | assert.ok(result); 17 | result = gt([-1,-5]); 18 | assert.ok(result); 19 | result = gt([-9,-5]); 20 | assert.ok(!result); 21 | }); 22 | 23 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/not-empty-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { notEmpty } from 'dr-elephant/helpers/not-empty'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | not empty'); 21 | 22 | test('Test for notEmpty helper', function(assert) { 23 | let result = notEmpty(["this is not empty"]); 24 | assert.ok(result); 25 | result = notEmpty([""]); 26 | assert.ok(!result); 27 | }); 28 | -------------------------------------------------------------------------------- /web/tests/unit/helpers/url-encode-test.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 LinkedIn Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { urlEncode } from 'dr-elephant/helpers/url-encode'; 18 | import { module, test } from 'qunit'; 19 | 20 | module('Unit | Helper | url encode'); 21 | 22 | test('Test for urlEncode helper', function(assert) { 23 | let result = urlEncode(["http://localhost:8090?flowid=abc&page=5&heuristic=Mapper Spill Heuristic"]); 24 | assert.equal(result,"http%3A%2F%2Flocalhost%3A8090%3Fflowid%3Dabc%26page%3D5%26heuristic%3DMapper%20Spill%20Heuristic"); 25 | }); 26 | --------------------------------------------------------------------------------