1 /*
2  *  Make.org Core API
3  *  Copyright (C) 2018 Make.org
4  *
5  * This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU Affero General Public License as
7  *  published by the Free Software Foundation, either version 3 of the
8  *  License, or (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU Affero General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Affero General Public License
16  *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  *
18  */
19 
20 package org.make.api.technical.healthcheck
21 
22 import akka.persistence.cassandra.query.scaladsl.CassandraReadJournal
23 import org.make.api.ConfigComponent
24 import org.make.api.extensions.{KafkaConfigurationComponent, MakeSettingsComponent}
25 import org.make.api.technical.BaseReadJournalComponent
26 import org.make.api.technical.ExecutorServiceHelper.RichExecutorService
27 import org.make.api.technical.elasticsearch.{ElasticsearchClientComponent, ElasticsearchConfigurationComponent}
28 import org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse
29 import org.make.api.technical.storage.SwiftClientComponent
30 
31 import java.util.concurrent.Executors
32 import scala.concurrent.{ExecutionContext, Future}
33 
34 trait HealthCheckService {
35   def runAllHealthChecks(): Future[Seq[HealthCheckResponse]]
36 }
37 
38 trait HealthCheckServiceComponent {
39   def healthCheckService: HealthCheckService
40 }
41 
42 trait DefaultHealthCheckServiceComponent extends HealthCheckServiceComponent {
43   self: BaseReadJournalComponent[CassandraReadJournal]
44     with ConfigComponent
45     with ElasticsearchClientComponent
46     with ElasticsearchConfigurationComponent
47     with KafkaConfigurationComponent
48     with MakeSettingsComponent
49     with SwiftClientComponent =>
50 
51   override lazy val healthCheckService: HealthCheckService = new DefaultHealthCheckService
52 
53   class DefaultHealthCheckService extends HealthCheckService {
54     implicit val ctx: ExecutionContext =
55       Executors.newFixedThreadPool(10).instrument("healthchecks").toExecutionContext
56 
57     val healthChecks: Seq[(String, HealthCheck)] = Seq(
58       "avro-health-check" -> new AvroHealthCheck(kafkaConfiguration),
59       "cassandra-health-check" -> new CassandraHealthCheck(proposalJournal, config),
60       "cockroach-health-check" -> new CockroachHealthCheck(makeSettings.defaultAdmin.email),
61       "elasticsearch-health-check" -> new ElasticsearchHealthCheck(elasticsearchConfiguration, elasticsearchClient),
62       "kafka-health-check" -> new KafkaHealthCheck(kafkaConfiguration),
63       "swift-health-check" -> new SwiftHealthCheck(swiftClient),
64       "zookeeper-health-check" -> new ZookeeperHealthCheck(config)
65     )
66 
67     override def runAllHealthChecks(): Future[Seq[HealthCheckResponse]] = {
68       Future.traverse(healthChecks) {
69         case (name, hc) =>
70           hc.healthCheck().map(status => HealthCheckResponse(name, status.message)).recoverWith {
71             case e => Future.successful(HealthCheckResponse(name, e.getMessage))
72           }
73       }
74     }
75   }
76 }
Line Stmt Id Pos Tree Symbol Tests Code
55 42375 2163 - 2222 Apply org.make.api.technical.ExecutorServiceHelper.RichExecutorService.instrument org.make.api.technical.ExecutorServiceHelper.RichExecutorService(java.util.concurrent.Executors.newFixedThreadPool(10)).instrument("healthchecks")
55 35274 2163 - 2241 Select org.make.api.technical.ExecutorServiceHelper.RichExecutorService.toExecutionContext org.make.api.technical.ExecutorServiceHelper.RichExecutorService(org.make.api.technical.ExecutorServiceHelper.RichExecutorService(java.util.concurrent.Executors.newFixedThreadPool(10)).instrument("healthchecks")).toExecutionContext
57 49923 2294 - 2873 Apply scala.collection.SeqFactory.Delegate.apply scala.`package`.Seq.apply[(String, org.make.api.technical.healthcheck.HealthCheck)](scala.Predef.ArrowAssoc[String]("avro-health-check").->[org.make.api.technical.healthcheck.AvroHealthCheck](new AvroHealthCheck(DefaultHealthCheckServiceComponent.this.kafkaConfiguration)), scala.Predef.ArrowAssoc[String]("cassandra-health-check").->[org.make.api.technical.healthcheck.CassandraHealthCheck](new CassandraHealthCheck(DefaultHealthCheckServiceComponent.this.proposalJournal, DefaultHealthCheckServiceComponent.this.config)), scala.Predef.ArrowAssoc[String]("cockroach-health-check").->[org.make.api.technical.healthcheck.CockroachHealthCheck](new CockroachHealthCheck(DefaultHealthCheckServiceComponent.this.makeSettings.defaultAdmin.email)), scala.Predef.ArrowAssoc[String]("elasticsearch-health-check").->[org.make.api.technical.healthcheck.ElasticsearchHealthCheck](new ElasticsearchHealthCheck(DefaultHealthCheckServiceComponent.this.elasticsearchConfiguration, DefaultHealthCheckServiceComponent.this.elasticsearchClient)), scala.Predef.ArrowAssoc[String]("kafka-health-check").->[org.make.api.technical.healthcheck.KafkaHealthCheck](new KafkaHealthCheck(DefaultHealthCheckServiceComponent.this.kafkaConfiguration)), scala.Predef.ArrowAssoc[String]("swift-health-check").->[org.make.api.technical.healthcheck.SwiftHealthCheck](new SwiftHealthCheck(DefaultHealthCheckServiceComponent.this.swiftClient)), scala.Predef.ArrowAssoc[String]("zookeeper-health-check").->[org.make.api.technical.healthcheck.ZookeeperHealthCheck](new ZookeeperHealthCheck(DefaultHealthCheckServiceComponent.this.config)))
58 36911 2328 - 2367 Apply org.make.api.technical.healthcheck.AvroHealthCheck.<init> new AvroHealthCheck(DefaultHealthCheckServiceComponent.this.kafkaConfiguration)
58 39755 2348 - 2366 Select org.make.api.extensions.KafkaConfigurationComponent.kafkaConfiguration DefaultHealthCheckServiceComponent.this.kafkaConfiguration
58 49660 2305 - 2367 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("avro-health-check").->[org.make.api.technical.healthcheck.AvroHealthCheck](new AvroHealthCheck(DefaultHealthCheckServiceComponent.this.kafkaConfiguration))
58 48577 2305 - 2324 Literal <nosymbol> "avro-health-check"
59 41808 2375 - 2399 Literal <nosymbol> "cassandra-health-check"
59 42893 2403 - 2452 Apply org.make.api.technical.healthcheck.CassandraHealthCheck.<init> new CassandraHealthCheck(DefaultHealthCheckServiceComponent.this.proposalJournal, DefaultHealthCheckServiceComponent.this.config)
59 46278 2445 - 2451 Select org.make.api.ConfigComponent.config DefaultHealthCheckServiceComponent.this.config
59 33681 2428 - 2443 Select org.make.api.technical.BaseReadJournalComponent.proposalJournal DefaultHealthCheckServiceComponent.this.proposalJournal
59 35310 2375 - 2452 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("cassandra-health-check").->[org.make.api.technical.healthcheck.CassandraHealthCheck](new CassandraHealthCheck(DefaultHealthCheckServiceComponent.this.proposalJournal, DefaultHealthCheckServiceComponent.this.config))
60 49421 2460 - 2545 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("cockroach-health-check").->[org.make.api.technical.healthcheck.CockroachHealthCheck](new CockroachHealthCheck(DefaultHealthCheckServiceComponent.this.makeSettings.defaultAdmin.email))
60 36367 2488 - 2545 Apply org.make.api.technical.healthcheck.CockroachHealthCheck.<init> new CockroachHealthCheck(DefaultHealthCheckServiceComponent.this.makeSettings.defaultAdmin.email)
60 40203 2513 - 2544 Select org.make.api.extensions.MakeSettings.DefaultAdmin.email DefaultHealthCheckServiceComponent.this.makeSettings.defaultAdmin.email
60 48340 2460 - 2484 Literal <nosymbol> "cockroach-health-check"
61 41843 2553 - 2581 Literal <nosymbol> "elasticsearch-health-check"
61 46724 2642 - 2661 Select org.make.api.technical.elasticsearch.ElasticsearchClientComponent.elasticsearchClient DefaultHealthCheckServiceComponent.this.elasticsearchClient
61 35066 2553 - 2662 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("elasticsearch-health-check").->[org.make.api.technical.healthcheck.ElasticsearchHealthCheck](new ElasticsearchHealthCheck(DefaultHealthCheckServiceComponent.this.elasticsearchConfiguration, DefaultHealthCheckServiceComponent.this.elasticsearchClient))
61 33725 2614 - 2640 Select org.make.api.technical.elasticsearch.ElasticsearchConfigurationComponent.elasticsearchConfiguration DefaultHealthCheckServiceComponent.this.elasticsearchConfiguration
61 42338 2585 - 2662 Apply org.make.api.technical.healthcheck.ElasticsearchHealthCheck.<init> new ElasticsearchHealthCheck(DefaultHealthCheckServiceComponent.this.elasticsearchConfiguration, DefaultHealthCheckServiceComponent.this.elasticsearchClient)
62 48862 2670 - 2734 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("kafka-health-check").->[org.make.api.technical.healthcheck.KafkaHealthCheck](new KafkaHealthCheck(DefaultHealthCheckServiceComponent.this.kafkaConfiguration))
62 40239 2715 - 2733 Select org.make.api.extensions.KafkaConfigurationComponent.kafkaConfiguration DefaultHealthCheckServiceComponent.this.kafkaConfiguration
62 36106 2694 - 2734 Apply org.make.api.technical.healthcheck.KafkaHealthCheck.<init> new KafkaHealthCheck(DefaultHealthCheckServiceComponent.this.kafkaConfiguration)
62 47835 2670 - 2690 Literal <nosymbol> "kafka-health-check"
63 46759 2766 - 2799 Apply org.make.api.technical.healthcheck.SwiftHealthCheck.<init> new SwiftHealthCheck(DefaultHealthCheckServiceComponent.this.swiftClient)
63 43388 2742 - 2799 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("swift-health-check").->[org.make.api.technical.healthcheck.SwiftHealthCheck](new SwiftHealthCheck(DefaultHealthCheckServiceComponent.this.swiftClient))
63 41881 2742 - 2762 Literal <nosymbol> "swift-health-check"
63 33468 2787 - 2798 Select org.make.api.technical.storage.SwiftClientComponent.swiftClient DefaultHealthCheckServiceComponent.this.swiftClient
64 47875 2860 - 2866 Select org.make.api.ConfigComponent.config DefaultHealthCheckServiceComponent.this.config
64 34507 2807 - 2831 Literal <nosymbol> "zookeeper-health-check"
64 31863 2807 - 2867 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String]("zookeeper-health-check").->[org.make.api.technical.healthcheck.ZookeeperHealthCheck](new ZookeeperHealthCheck(DefaultHealthCheckServiceComponent.this.config))
64 40000 2835 - 2867 Apply org.make.api.technical.healthcheck.ZookeeperHealthCheck.<init> new ZookeeperHealthCheck(DefaultHealthCheckServiceComponent.this.config)
68 35055 2957 - 3214 ApplyToImplicitArgs scala.concurrent.Future.traverse scala.concurrent.Future.traverse[(String, org.make.api.technical.healthcheck.HealthCheck), org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse, Seq](DefaultHealthCheckService.this.healthChecks)(((x0$1: (String, org.make.api.technical.healthcheck.HealthCheck)) => x0$1 match { case (_1: String, _2: org.make.api.technical.healthcheck.HealthCheck): (String, org.make.api.technical.healthcheck.HealthCheck)((name @ _), (hc @ _)) => hc.healthCheck()(DefaultHealthCheckService.this.ctx).map[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse](((status: org.make.api.technical.healthcheck.HealthCheck.Status) => org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply(name, status.message)))(DefaultHealthCheckService.this.ctx).recoverWith[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse](({ @SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[Throwable,scala.concurrent.Future[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]] with java.io.Serializable { def <init>(): <$anon: Throwable => scala.concurrent.Future[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]> = { $anonfun.super.<init>(); () }; final override def applyOrElse[A1 <: Throwable, B1 >: scala.concurrent.Future[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[Throwable]: Throwable): Throwable @unchecked) match { case (e @ _) => scala.concurrent.Future.successful[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse](org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply(name, e.getMessage())) case (defaultCase$ @ _) => default.apply(x1) }; final def isDefinedAt(x1: Throwable): Boolean = ((x1.asInstanceOf[Throwable]: Throwable): Throwable @unchecked) match { case (e @ _) => true case (defaultCase$ @ _) => false } }; new $anonfun() }: PartialFunction[Throwable,scala.concurrent.Future[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]]))(DefaultHealthCheckService.this.ctx) }))(collection.this.BuildFrom.buildFromIterableOps[Seq, (String, org.make.api.technical.healthcheck.HealthCheck), org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse], DefaultHealthCheckService.this.ctx)
68 43180 2987 - 2987 Select org.make.api.technical.healthcheck.DefaultHealthCheckServiceComponent.DefaultHealthCheckService.ctx DefaultHealthCheckService.this.ctx
68 47327 2987 - 2987 TypeApply scala.collection.BuildFromLowPriority2.buildFromIterableOps collection.this.BuildFrom.buildFromIterableOps[Seq, (String, org.make.api.technical.healthcheck.HealthCheck), org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]
68 41800 2973 - 2985 Select org.make.api.technical.healthcheck.DefaultHealthCheckServiceComponent.DefaultHealthCheckService.healthChecks DefaultHealthCheckService.this.healthChecks
70 43429 3057 - 3098 Apply org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply(name, status.message)
70 41837 3112 - 3112 Select org.make.api.technical.healthcheck.DefaultHealthCheckServiceComponent.DefaultHealthCheckService.ctx DefaultHealthCheckService.this.ctx
70 46526 3083 - 3097 Select org.make.api.technical.healthcheck.HealthCheck.Status.message status.message
70 33977 3026 - 3206 ApplyToImplicitArgs scala.concurrent.Future.recoverWith hc.healthCheck()(DefaultHealthCheckService.this.ctx).map[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse](((status: org.make.api.technical.healthcheck.HealthCheck.Status) => org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply(name, status.message)))(DefaultHealthCheckService.this.ctx).recoverWith[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse](({ @SerialVersionUID(value = 0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[Throwable,scala.concurrent.Future[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]] with java.io.Serializable { def <init>(): <$anon: Throwable => scala.concurrent.Future[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]> = { $anonfun.super.<init>(); () }; final override def applyOrElse[A1 <: Throwable, B1 >: scala.concurrent.Future[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[Throwable]: Throwable): Throwable @unchecked) match { case (e @ _) => scala.concurrent.Future.successful[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse](org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply(name, e.getMessage())) case (defaultCase$ @ _) => default.apply(x1) }; final def isDefinedAt(x1: Throwable): Boolean = ((x1.asInstanceOf[Throwable]: Throwable): Throwable @unchecked) match { case (e @ _) => true case (defaultCase$ @ _) => false } }; new $anonfun() }: PartialFunction[Throwable,scala.concurrent.Future[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse]]))(DefaultHealthCheckService.this.ctx)
70 49959 3112 - 3112 Apply org.make.api.technical.healthcheck.DefaultHealthCheckServiceComponent.DefaultHealthCheckService.$anonfun.<init> new $anonfun()
70 33510 3040 - 3040 Select org.make.api.technical.healthcheck.DefaultHealthCheckServiceComponent.DefaultHealthCheckService.ctx DefaultHealthCheckService.this.ctx
70 34550 3046 - 3046 Select org.make.api.technical.healthcheck.DefaultHealthCheckServiceComponent.DefaultHealthCheckService.ctx DefaultHealthCheckService.this.ctx
71 32929 3136 - 3194 Apply scala.concurrent.Future.successful scala.concurrent.Future.successful[org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse](org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply(name, e.getMessage()))
71 48330 3180 - 3192 Apply java.lang.Throwable.getMessage e.getMessage()
71 40036 3154 - 3193 Apply org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply org.make.api.technical.healthcheck.HealthCheck.HealthCheckResponse.apply(name, e.getMessage())