Skip to content

Commit f577efc

Browse files
committed
Update metrics scheduler
1 parent 3a14b5b commit f577efc

File tree

7 files changed

+81
-73
lines changed

7 files changed

+81
-73
lines changed

modules/infra/src/main/scala/scaladex/infra/SqlDatabase.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package scaladex.infra
22

33
import java.time.Instant
4+
import java.time.OffsetDateTime
5+
import java.time.ZoneOffset
46
import java.util.UUID
57

68
import scala.concurrent.ExecutionContext.Implicits.global
@@ -33,6 +35,7 @@ import scaladex.infra.sql.ProjectTable
3335
import scaladex.infra.sql.ReleaseDependenciesTable
3436
import scaladex.infra.sql.ReleaseTable
3537
import scaladex.infra.sql.UserSessionsTable
38+
import scaladex.core.model.BinaryVersion
3639

3740
class SqlDatabase(datasource: HikariDataSource, xa: doobie.Transactor[IO]) extends SchedulerDatabase with LazyLogging {
3841
private val flyway = DoobieUtils.flyway(datasource)
@@ -150,6 +153,16 @@ class SqlDatabase(datasource: HikariDataSource, xa: doobie.Transactor[IO]) exten
150153
def countProjects(): Future[Long] =
151154
run(ProjectTable.countProjects.unique)
152155

156+
def countProjects(year: Int): Future[Long] = {
157+
val instant = OffsetDateTime.of(year + 1, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC).toInstant
158+
run(ProjectTable.countProjectsUntil.unique(instant))
159+
}
160+
161+
def getProjectsByYear(year: Int): Future[Seq[(Project.Reference, Language)]] = {
162+
val instant = OffsetDateTime.of(year + 1, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC).toInstant
163+
run(ArtifactTable.selectProjectsUntil.to[Seq](instant))
164+
}
165+
153166
override def countArtifacts(): Future[Long] =
154167
run(ArtifactTable.count.unique)
155168

modules/infra/src/main/scala/scaladex/infra/sql/ArtifactTable.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,4 +160,12 @@ object ArtifactTable {
160160
groupBy = Seq("group_id", "artifact_id")
161161
)
162162
}
163+
164+
val selectProjectsUntil: Query[Instant, (Project.Reference, Language)] =
165+
selectRequest1[Instant, (Project.Reference, Language)](
166+
table,
167+
Seq("organization", "repository", "language_version"),
168+
where = Seq("release_date < ?"),
169+
groupBy = Seq("organization", "repository", "language_version")
170+
)
163171
}

modules/infra/src/main/scala/scaladex/infra/sql/ProjectTable.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ object ProjectTable {
4545
val countProjects: Query0[Long] =
4646
selectRequest(table, Seq("count(*)"))
4747

48+
val countProjectsUntil: Query[Instant, Long] =
49+
selectRequest1(
50+
table,
51+
Seq("count(*)"),
52+
where = Seq("creation_date < ?", "github_status!='Moved'", "github_status!='NotFound'")
53+
)
54+
4855
val selectByReference: Query[Project.Reference, Project] =
4956
selectRequest(fullTable, allFields, referenceFields.map(f => s"p.$f"))
5057

modules/server/src/main/scala/scaladex/server/service/AdminService.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ import scaladex.core.model.Project
1212
import scaladex.core.model.Project.Settings
1313
import scaladex.core.model.UserState
1414
import scaladex.core.service.GithubClient
15-
import scaladex.core.service.SchedulerDatabase
1615
import scaladex.core.service.SearchEngine
1716
import scaladex.core.util.ScalaExtensions._
17+
import scaladex.infra.SqlDatabase
1818
import scaladex.view.Job
1919
import scaladex.view.Task
2020

2121
class AdminService(
2222
env: Env,
23-
database: SchedulerDatabase,
23+
database: SqlDatabase,
2424
searchEngine: SearchEngine,
2525
githubClientOpt: Option[GithubClient],
2626
sonatypeSynchronizer: SonatypeService
@@ -39,7 +39,8 @@ class AdminService(
3939
new JobScheduler(Job.projectDependencies, projectDependenciesUpdater.updateAll),
4040
new JobScheduler(Job.projectCreationDates, updateProjectCreationDate),
4141
new JobScheduler(Job.moveArtifacts, artifactsService.moveAll),
42-
new JobScheduler(Job.userSessions, userSessionService.updateAll)
42+
new JobScheduler(Job.userSessions, userSessionService.updateAll),
43+
new JobScheduler(Job.metrics, (new Metrics(database)).run)
4344
) ++
4445
githubClientOpt.map { client =>
4546
val githubUpdater = new GithubUpdater(database, client)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package scaladex.server.service
2+
3+
import scala.concurrent.ExecutionContext
4+
import scala.concurrent.Future
5+
6+
import cats.implicits.toTraverseOps
7+
import com.typesafe.scalalogging.LazyLogging
8+
import scaladex.infra.SqlDatabase
9+
import scaladex.core.model.Scala
10+
11+
class Metrics(db: SqlDatabase)(implicit ec: ExecutionContext) extends LazyLogging {
12+
def run(): Future[String] = {
13+
val years: Seq[Int] = Range.inclusive(2013, 2022)
14+
for {
15+
projectsByYear <- years.traverse(db.getProjectsByYear)
16+
projects <- db.getAllProjects()
17+
} yield {
18+
val projectMap = projects.map(p => p.reference -> p).toMap
19+
years.zip(projectsByYear).foreach { case (year, projects) =>
20+
logger.info(s"$year:")
21+
val all = projects
22+
.groupMap(_._1)(_._2)
23+
.view
24+
.filterKeys(k => projectMap.get(k).filter(p => !p.githubStatus.isMoved && !p.githubStatus.isNotFound).nonEmpty)
25+
.values.map(_.toSet).toSeq
26+
val scala3 = all.count(_.contains(Scala.`3`))
27+
val scala213 = all.count(ls => ls.contains(Scala.`2.13`) && !ls.contains(Scala.`3`))
28+
val scala212 = all.count(ls => ls.contains(Scala.`2.12`) && !ls.contains(Scala.`2.13`) && !ls.contains(Scala.`3`))
29+
val scala211 = all.count(ls => ls.contains(Scala.`2.11`) && !ls.contains(Scala.`2.12`) && !ls.contains(Scala.`2.13`) && !ls.contains(Scala.`3`))
30+
val scala210 = all.count(ls => ls.contains(Scala.`2.10`) && !ls.contains(Scala.`2.11`) && !ls.contains(Scala.`2.12`) && !ls.contains(Scala.`2.13`) && !ls.contains(Scala.`3`))
31+
logger.info(s" Scala 2.10: $scala210")
32+
logger.info(s" Scala 2.11: $scala211")
33+
logger.info(s" Scala 2.12: $scala212")
34+
logger.info(s" Scala 2.13: $scala213")
35+
logger.info(s" Scala 3: $scala3")
36+
}
37+
val filteredProjects = projects.filter(p => !p.githubStatus.isMoved && !p.githubStatus.isNotFound)
38+
logger.info(s"total projects: ${filteredProjects.size}")
39+
val contributors = filteredProjects.flatMap(_.githubInfo).flatMap(_.contributors).map(_.login).distinct.size
40+
logger.info(s"total contributors: $contributors")
41+
"Success"
42+
}
43+
}
44+
}

modules/template/src/main/scala/scaladex/view/Job.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ object Job {
4444
"Find missing artifacts in Maven Central of the known group IDs.",
4545
24.hours
4646
)
47+
val metrics: Job = Job(
48+
"metrics",
49+
"Print regular metrics into the logs",
50+
24.hours
51+
)
4752

4853
case class Status(state: State, results: Seq[Result], progress: Option[Progress]) {
4954
def isStarted: Boolean = state.isInstanceOf[Started]

server/src/main/scala/scaladex/server/service/Metrics.scala

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)