Skip to content

Commit 90b2f9f

Browse files
authored
Split project into modules (typelevel#39)
1 parent 41a7b50 commit 90b2f9f

File tree

55 files changed

+948
-572
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+948
-572
lines changed

.github/workflows/ci.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ jobs:
9494

9595
- name: Make target directories
9696
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
97-
run: mkdir -p target .js/target site/target core/.js/target core/.jvm/target .jvm/target .native/target java/.jvm/target testkit/jvm/target project/target
97+
run: mkdir -p testkit/metrics/jvm/target java/metrics/target testkit/common/jvm/target target core/common/.jvm/target .js/target site/target core/metrics/.jvm/target core/all/.js/target java/all/target java/common/target core/metrics/.js/target core/all/.jvm/target .jvm/target .native/target core/common/.js/target testkit/all/jvm/target project/target
9898

9999
- name: Compress target directories
100100
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
101-
run: tar cf targets.tar target .js/target site/target core/.js/target core/.jvm/target .jvm/target .native/target java/.jvm/target testkit/jvm/target project/target
101+
run: tar cf targets.tar testkit/metrics/jvm/target java/metrics/target testkit/common/jvm/target target core/common/.jvm/target .js/target site/target core/metrics/.jvm/target core/all/.js/target java/all/target java/common/target core/metrics/.js/target core/all/.jvm/target .jvm/target .native/target core/common/.js/target testkit/all/jvm/target project/target
102102

103103
- name: Upload target directories
104104
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')

build.sbt

+100-30
Original file line numberDiff line numberDiff line change
@@ -21,57 +21,127 @@ val Scala213 = "2.13.8"
2121
ThisBuild / crossScalaVersions := Seq(Scala213, "3.1.3")
2222
ThisBuild / scalaVersion := Scala213 // the default Scala
2323

24+
val CatsVersion = "2.8.0"
25+
val CatsEffectVersion = "3.3.14"
26+
val MUnitVersion = "0.7.29"
27+
val MUnitCatsEffectVersion = "1.0.7"
28+
val OpenTelemetryVersion = "1.15.0"
29+
30+
lazy val scalaReflectDependency = Def.settings(
31+
libraryDependencies ++= {
32+
if (tlIsScala3.value) Nil
33+
else Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided)
34+
}
35+
)
36+
2437
lazy val root = tlCrossRootProject
25-
.aggregate(core, testkit, java)
38+
.aggregate(
39+
`core-common`,
40+
`core-metrics`,
41+
core,
42+
`testkit-common`,
43+
`testkit-metrics`,
44+
testkit,
45+
`java-common`,
46+
`java-metrics`,
47+
java
48+
)
2649
.settings(name := "otel4s")
2750

51+
lazy val `core-common` = crossProject(JVMPlatform, JSPlatform)
52+
.crossType(CrossType.Pure)
53+
.in(file("core/common"))
54+
.settings(
55+
name := "otel4s-core-common",
56+
libraryDependencies ++= Seq(
57+
"org.typelevel" %%% "cats-core" % CatsVersion,
58+
"org.scalameta" %%% "munit" % MUnitVersion % Test
59+
)
60+
)
61+
62+
lazy val `core-metrics` = crossProject(JVMPlatform, JSPlatform)
63+
.crossType(CrossType.Pure)
64+
.in(file("core/metrics"))
65+
.dependsOn(`core-common`)
66+
.settings(scalaReflectDependency)
67+
.settings(
68+
name := "otel4s-core-metrics",
69+
libraryDependencies ++= Seq(
70+
"org.typelevel" %%% "cats-effect-kernel" % CatsEffectVersion,
71+
"org.scalameta" %%% "munit" % MUnitVersion % Test,
72+
"org.typelevel" %%% "munit-cats-effect-3" % MUnitCatsEffectVersion % Test,
73+
"org.typelevel" %%% "cats-effect-testkit" % CatsEffectVersion % Test
74+
)
75+
)
76+
2877
lazy val core = crossProject(JVMPlatform, JSPlatform)
2978
.crossType(CrossType.Pure)
30-
.in(file("core"))
79+
.in(file("core/all"))
80+
.dependsOn(`core-common`, `core-metrics`)
81+
.settings(
82+
name := "otel4s-core"
83+
)
84+
85+
lazy val `testkit-common` = crossProject(JVMPlatform)
86+
.crossType(CrossType.Full)
87+
.in(file("testkit/common"))
88+
.dependsOn(`core-common`)
3189
.settings(
32-
name := "otel4s-core",
90+
name := "otel4s-testkit-common"
91+
)
92+
93+
lazy val `testkit-metrics` = crossProject(JVMPlatform)
94+
.crossType(CrossType.Full)
95+
.in(file("testkit/metrics"))
96+
.dependsOn(`testkit-common`, `core-metrics`)
97+
.settings(
98+
name := "otel4s-testkit-metrics"
99+
)
100+
.jvmSettings(
33101
libraryDependencies ++= Seq(
34-
"org.typelevel" %%% "cats-core" % "2.8.0",
35-
"org.typelevel" %%% "cats-effect" % "3.3.14",
36-
"org.scalameta" %%% "munit" % "0.7.29" % Test,
37-
"org.typelevel" %%% "munit-cats-effect-3" % "1.0.7" % Test,
38-
"org.typelevel" %%% "cats-effect-testkit" % "3.3.14" % Test
39-
),
40-
libraryDependencies ++= {
41-
if (tlIsScala3.value) Nil
42-
else
43-
Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided)
44-
}
102+
"io.opentelemetry" % "opentelemetry-api" % OpenTelemetryVersion,
103+
"io.opentelemetry" % "opentelemetry-sdk" % OpenTelemetryVersion,
104+
"io.opentelemetry" % "opentelemetry-sdk-testing" % OpenTelemetryVersion
105+
)
45106
)
46107

47108
lazy val testkit = crossProject(JVMPlatform)
48109
.crossType(CrossType.Full)
49-
.in(file("testkit"))
110+
.in(file("testkit/all"))
111+
.dependsOn(`testkit-common`, `testkit-metrics`)
50112
.settings(
51113
name := "otel4s-testkit"
52114
)
53-
.jvmSettings(
115+
116+
lazy val `java-common` = project
117+
.in(file("java/common"))
118+
.dependsOn(`core-common`.jvm, `testkit-common`.jvm)
119+
.settings(
120+
name := "otel4s-java-common",
54121
libraryDependencies ++= Seq(
55-
"io.opentelemetry" % "opentelemetry-api" % "1.15.0",
56-
"io.opentelemetry" % "opentelemetry-sdk" % "1.15.0",
57-
"io.opentelemetry" % "opentelemetry-sdk-testing" % "1.15.0"
122+
"io.opentelemetry" % "opentelemetry-api" % OpenTelemetryVersion
58123
)
59124
)
60-
.dependsOn(core)
61125

62-
lazy val java = crossProject(JVMPlatform)
63-
.crossType(CrossType.Pure)
64-
.in(file("java"))
126+
lazy val `java-metrics` = project
127+
.in(file("java/metrics"))
128+
.dependsOn(`java-common`, `core-metrics`.jvm, `testkit-metrics`.jvm)
65129
.settings(
66-
name := "otel4s-java",
130+
name := "otel4s-java-metrics",
67131
libraryDependencies ++= Seq(
68-
"io.opentelemetry" % "opentelemetry-api" % "1.15.0",
69-
"io.opentelemetry" % "opentelemetry-sdk" % "1.15.0" % Test,
70-
"io.opentelemetry" % "opentelemetry-sdk-testing" % "1.15.0" % Test,
71-
"org.scalameta" %% "munit" % "0.7.29" % Test,
72-
"org.typelevel" %% "munit-cats-effect-3" % "1.0.7" % Test
132+
"io.opentelemetry" % "opentelemetry-api" % OpenTelemetryVersion,
133+
"io.opentelemetry" % "opentelemetry-sdk" % OpenTelemetryVersion % Test,
134+
"io.opentelemetry" % "opentelemetry-sdk-testing" % OpenTelemetryVersion % Test,
135+
"org.scalameta" %% "munit" % MUnitVersion % Test,
136+
"org.typelevel" %% "munit-cats-effect-3" % MUnitCatsEffectVersion % Test
73137
)
74138
)
75-
.dependsOn(core, testkit)
139+
140+
lazy val java = project
141+
.in(file("java/all"))
142+
.dependsOn(core.jvm, `java-metrics`)
143+
.settings(
144+
name := "otel4s-java"
145+
)
76146

77147
lazy val docs = project.in(file("site")).enablePlugins(TypelevelSitePlugin)

core/src/main/scala/org/typelevel/otel4s/Otel4s.scala renamed to core/all/src/main/scala/org/typelevel/otel4s/Otel4s.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import org.typelevel.otel4s.metrics.MeterProvider
2020

2121
trait Otel4s[F[_]] {
2222

23-
/** A registry for creating named [[org.typelevel.otel4s.metrics.Meter]].
23+
/** A registry for creating named meters.
2424
*/
2525
def meterProvider: MeterProvider[F]
2626
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright 2022 Typelevel
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of 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,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.typelevel.otel4s.meta
18+
19+
import cats.Applicative
20+
21+
trait InstrumentMeta[F[_]] {
22+
23+
/** Indicates whether instrumentation is enabled or not.
24+
*/
25+
def isEnabled: Boolean
26+
27+
/** A no-op effect.
28+
*/
29+
def unit: F[Unit]
30+
31+
}
32+
33+
object InstrumentMeta {
34+
35+
def enabled[F[_]: Applicative]: InstrumentMeta[F] =
36+
make(enabled = true)
37+
38+
def disabled[F[_]: Applicative]: InstrumentMeta[F] =
39+
make(enabled = false)
40+
41+
private def make[F[_]: Applicative](enabled: Boolean): InstrumentMeta[F] =
42+
new InstrumentMeta[F] {
43+
val isEnabled: Boolean = enabled
44+
val unit: F[Unit] = Applicative[F].unit
45+
}
46+
47+
}

core/src/main/scala/org/typelevel/otel4s/metrics/InstrumentBackend.scala renamed to core/common/src/test/scala/org/typelevel/otel4s/meta/InstrumentMetaSuite.scala

+19-6
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,24 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.typelevel.otel4s.metrics
17+
package org.typelevel.otel4s.meta
18+
19+
import munit.FunSuite
20+
21+
class InstrumentMetaSuite extends FunSuite {
22+
23+
test("enabled") {
24+
val disabled = InstrumentMeta.enabled[cats.Id]
25+
26+
assertEquals(disabled.unit, ())
27+
assertEquals(disabled.isEnabled, true)
28+
}
29+
30+
test("disabled") {
31+
val disabled = InstrumentMeta.disabled[cats.Id]
32+
33+
assertEquals(disabled.unit, ())
34+
assertEquals(disabled.isEnabled, false)
35+
}
1836

19-
/** A backend that implements instrument operations: add, record, etc.
20-
*/
21-
trait InstrumentBackend[F[_]] {
22-
def isEnabled: Boolean
23-
def unit: F[Unit]
2437
}

core/src/main/scala-2/org/typelevel/otel4s/metrics/CounterMacro.scala renamed to core/metrics/src/main/scala-2/org/typelevel/otel4s/metrics/CounterMacro.scala

+29-2
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,40 @@ private[otel4s] trait CounterMacro[F[_], A] {
2929
* the set of attributes to associate with the value
3030
*/
3131
def add(value: A, attributes: Attribute[_]*): F[Unit] =
32-
macro MetricsMacro.add[A]
32+
macro CounterMacro.add[A]
3333

3434
/** Increments a counter by one.
3535
*
3636
* @param attributes
3737
* the set of attributes to associate with the value
3838
*/
3939
def inc(attributes: Attribute[_]*): F[Unit] =
40-
macro MetricsMacro.inc
40+
macro CounterMacro.inc
41+
42+
}
43+
44+
object CounterMacro {
45+
import scala.reflect.macros.blackbox
46+
47+
def add[A](c: blackbox.Context)(
48+
value: c.Expr[A],
49+
attributes: c.Expr[Attribute[_]]*
50+
): c.universe.Tree = {
51+
import c.universe._
52+
val backend = q"${c.prefix}.backend"
53+
val meta = q"$backend.meta"
54+
55+
q"if ($meta.isEnabled) $backend.add($value, ..$attributes) else $meta.unit"
56+
}
57+
58+
def inc(c: blackbox.Context)(
59+
attributes: c.Expr[Attribute[_]]*
60+
): c.universe.Tree = {
61+
import c.universe._
62+
val backend = q"${c.prefix}.backend"
63+
val meta = q"$backend.meta"
64+
65+
q"if ($meta.isEnabled) $backend.inc(..$attributes) else $meta.unit"
66+
}
67+
4168
}

core/src/main/scala-2/org/typelevel/otel4s/metrics/HistogramMacro.scala renamed to core/metrics/src/main/scala-2/org/typelevel/otel4s/metrics/HistogramMacro.scala

+30-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package org.typelevel.otel4s
1818
package metrics
1919

20-
import cats.effect.Resource
20+
import cats.effect.kernel.Resource
2121

2222
import scala.concurrent.duration.TimeUnit
2323

@@ -33,7 +33,7 @@ private[otel4s] trait HistogramMacro[F[_], A] {
3333
* the set of attributes to associate with the value
3434
*/
3535
def record(value: A, attributes: Attribute[_]*): F[Unit] =
36-
macro MetricsMacro.record[A]
36+
macro HistogramMacro.record[A]
3737

3838
/** Records duration of the given effect.
3939
*
@@ -58,6 +58,33 @@ private[otel4s] trait HistogramMacro[F[_], A] {
5858
timeUnit: TimeUnit,
5959
attributes: Attribute[_]*
6060
): Resource[F, Unit] =
61-
macro MetricsMacro.recordDuration
61+
macro HistogramMacro.recordDuration
62+
63+
}
64+
65+
object HistogramMacro {
66+
import scala.reflect.macros.blackbox
67+
68+
def record[A](c: blackbox.Context)(
69+
value: c.Expr[A],
70+
attributes: c.Expr[Attribute[_]]*
71+
): c.universe.Tree = {
72+
import c.universe._
73+
val backend = q"${c.prefix}.backend"
74+
val meta = q"$backend.meta"
75+
76+
q"if ($meta.isEnabled) $backend.record($value, ..$attributes) else $meta.unit"
77+
}
78+
79+
def recordDuration(c: blackbox.Context)(
80+
timeUnit: c.Expr[TimeUnit],
81+
attributes: c.Expr[Attribute[_]]*
82+
): c.universe.Tree = {
83+
import c.universe._
84+
val backend = q"${c.prefix}.backend"
85+
val meta = q"$backend.meta"
86+
87+
q"if ($meta.isEnabled) $backend.recordDuration($timeUnit, ..$attributes) else $meta.resourceUnit"
88+
}
6289

6390
}

0 commit comments

Comments
 (0)