Skip to content

Commit d1b48cb

Browse files
committed
Use tofu.Mid for the enchanced logging
1 parent 30990a5 commit d1b48cb

File tree

9 files changed

+95
-16
lines changed

9 files changed

+95
-16
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88

99
## Added
1010
- Add MosaicRasterSourceIO logging [#366](https://github.com/geotrellis/geotrellis-server/pull/366)
11+
- Use tofu.Mid for the enchanced logging [#367](https://github.com/geotrellis/geotrellis-server/pull/367)
1112

1213
## Fixed
1314
- WMS Parent Layer default time should be omitted [#368](https://github.com/geotrellis/geotrellis-server/pull/368)

build.sbt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ lazy val `stac-example` = project
399399
sttpHttp4s,
400400
refinedCats,
401401
refinedPureconfig,
402-
ansiColors212
402+
ansiColors212,
403+
tofuCore
403404
),
404405
excludeDependencies ++= Seq(
405406
// log4j brought in via uzaygezen is a pain for us

project/Dependencies.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,5 @@ object Dependencies {
7575
val refinedPureconfig = "eu.timepit" %% "refined-pureconfig" % refinedVer
7676
val threetenExtra = "org.threeten" % "threeten-extra" % "1.6.0"
7777
val ansiColors212 = "org.backuity" %% "ansi-interpolator" % "1.1.0" % Provided
78+
val tofuCore = "tf.tofu" %% "tofu-core" % "0.10.2"
7879
}

stac-example/src/main/scala/geotrellis/server/ogc/conf/OgcServiceConf.scala

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@ package geotrellis.server.ogc.conf
1919
import cats.{MonadThrow, SemigroupK}
2020
import cats.instances.list._
2121
import cats.syntax.semigroup._
22-
2322
import geotrellis.proj4.CRS
24-
import geotrellis.server.ogc.{ows, OgcSource, OgcSourceRepository, RasterOgcSource}
23+
import geotrellis.server.ogc.{OgcSource, OgcSourceRepository, RasterOgcSource, ows}
2524
import geotrellis.server.ogc.wms.WmsParentLayerMeta
2625
import geotrellis.server.ogc.wmts.GeotrellisTileMatrixSet
2726
import geotrellis.server.ogc.stac._
2827
import geotrellis.store.query.{Repository, RepositoryM}
29-
28+
import io.chrisdavenport.log4cats.Logger
3029
import sttp.client3.SttpBackend
3130

3231
/** Each service has its own unique configuration requirements (see the below instances)
@@ -42,7 +41,7 @@ sealed trait OgcServiceConf {
4241
OgcSourceRepository(rasterLayers ++ mapAlgebraLayers)
4342
}
4443

45-
def layerSources[F[_]: SemigroupK: MonadThrow](
44+
def layerSources[F[_]: SemigroupK: MonadThrow: Logger](
4645
rasterOgcSources: List[RasterOgcSource],
4746
client: SttpBackend[F, Any]
4847
): RepositoryM[F, List, OgcSource] = {

stac-example/src/main/scala/geotrellis/server/ogc/stac/MapAlgebraStacOgcRepositories.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ import geotrellis.server.ogc.conf.{MapAlgebraSourceConf, OgcSourceConf, RasterSo
2121
import geotrellis.store.query
2222
import geotrellis.store.query._
2323
import geotrellis.server.ogc._
24-
2524
import cats.{Functor, MonadThrow}
2625
import cats.syntax.functor._
2726
import cats.syntax.semigroup._
2827
import cats.instances.list._
28+
import io.chrisdavenport.log4cats.Logger
2929
import sttp.client3.SttpBackend
3030

3131
case class MapAlgebraStacOgcRepository[F[_]: Functor](
@@ -46,7 +46,7 @@ case class MapAlgebraStacOgcRepository[F[_]: Functor](
4646
.widen
4747
}
4848

49-
case class MapAlgebraStacOgcRepositories[F[_]: MonadThrow](
49+
case class MapAlgebraStacOgcRepositories[F[_]: MonadThrow: Logger](
5050
mapAlgebraConfLayers: List[MapAlgebraSourceConf],
5151
ogcLayers: List[OgcSourceConf],
5252
client: SttpBackend[F, Any]

stac-example/src/main/scala/geotrellis/server/ogc/stac/SearchFiltersQuery.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import com.azavea.stac4s.{Bbox, TwoDimBbox}
2424
import com.azavea.stac4s.jvmTypes.TemporalExtent
2525
import com.azavea.stac4s.api.client.{SearchFilters, StacClient, Superset}
2626
import io.circe.syntax._
27-
import higherkindness.droste.{scheme, Algebra}
27+
import higherkindness.droste.{Algebra, scheme}
2828
import geotrellis.vector._
2929
import cats.{Applicative, Order, Semigroup}
3030
import cats.data.NonEmptyVector
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright 2021 Azavea
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 geotrellis.server.ogc.stac
18+
19+
import com.azavea.stac4s.{StacCollection, StacItem}
20+
import com.azavea.stac4s.api.client.{SearchFilters, StacClient, StacClientF}
21+
import cats.Monad
22+
import eu.timepit.refined.types.string.NonEmptyString
23+
import io.chrisdavenport.log4cats.Logger
24+
import tofu.higherKind.Mid
25+
import cats.syntax.apply._
26+
import cats.syntax.flatMap._
27+
import io.circe.syntax._
28+
29+
final class StacClientLoggingMid[F[_]: Monad: Logger] extends StacClientF[Mid[F, *], SearchFilters] {
30+
val logger = Logger[F]
31+
32+
def search: Mid[F, List[StacItem]] =
33+
res =>
34+
logger.trace(s"search all endpoint call") *>
35+
res.flatTap(items => logger.trace(s"retrieved items: ${items.asJson}"))
36+
37+
def search(filter: SearchFilters): Mid[F, List[StacItem]] =
38+
res =>
39+
logger.trace(s"search ${filter.asJson} endpoint call") *>
40+
res.flatTap(items => logger.trace(s"retrieved items: ${items.asJson}"))
41+
42+
def collections: Mid[F, List[StacCollection]] =
43+
res =>
44+
logger.trace(s"collections all endpoint call") *>
45+
res.flatTap(collections => logger.trace(s"retrieved collections: ${collections.asJson}"))
46+
47+
def collection(collectionId: NonEmptyString): Mid[F, StacCollection] =
48+
res =>
49+
logger.trace(s"collections collectionId: $collectionId endpoint call") *>
50+
res.flatTap(collection => logger.trace(s"retrieved collection: ${collection.asJson}"))
51+
52+
def items(collectionId: NonEmptyString): Mid[F, List[StacItem]] =
53+
res =>
54+
logger.trace(s"items by collectionId: $collectionId endpoint call") *>
55+
res.flatTap(items => logger.trace(s"retrieved items: ${items.asJson}"))
56+
57+
def item(collectionId: NonEmptyString, itemId: NonEmptyString): Mid[F, StacItem] =
58+
res =>
59+
logger.trace(s"item by collectionId: $collectionId and itemId: $itemId endpoint call") *>
60+
res.flatTap(items => logger.trace(s"retrieved items: ${items.asJson}"))
61+
62+
def itemCreate(collectionId: NonEmptyString, item: StacItem): Mid[F, StacItem] =
63+
res =>
64+
logger.trace(s"itemCreate for collectionId: $collectionId and item: $item") *>
65+
res.flatTap(item => logger.trace(s"created item: ${item.asJson}"))
66+
67+
def collectionCreate(collection: StacCollection): Mid[F, StacCollection] =
68+
res =>
69+
logger.trace(s"collectionCreate of collection: $collection") *>
70+
res.flatTap(collection => logger.trace(s"created collection: ${collection.asJson}"))
71+
}
72+
73+
object StacClientLoggingMid {
74+
def apply[F[_]: Monad: Logger]: StacClient[Mid[F, *]] = new StacClientLoggingMid[F]
75+
}

stac-example/src/main/scala/geotrellis/server/ogc/stac/StacOgcRepositories.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import geotrellis.raster.{EmptyName, MosaicRasterSource, RasterSource}
2424
import geotrellis.server.ogc.OgcSource
2525
import geotrellis.server.ogc.conf.{OgcSourceConf, StacSourceConf}
2626
import geotrellis.raster.effects.MosaicRasterSourceIO
27-
2827
import sttp.client3.SttpBackend
2928
import sttp.client3.UriContext
3029
import geotrellis.store.query
@@ -36,11 +35,12 @@ import cats.syntax.apply._
3635
import cats.syntax.option._
3736
import cats.syntax.semigroup._
3837
import cats.instances.list._
39-
import higherkindness.droste.{scheme, Algebra}
38+
import higherkindness.droste.{Algebra, scheme}
39+
import io.chrisdavenport.log4cats.Logger
4040

4141
case class StacOgcRepository[F[_]: Applicative](
4242
stacSourceConf: StacSourceConf,
43-
client: SttpStacClient[F]
43+
client: StacClient[F]
4444
) extends RepositoryM[F, List, OgcSource] {
4545
def store: F[List[OgcSource]] = find(query.all)
4646

@@ -114,7 +114,7 @@ case class StacOgcRepository[F[_]: Applicative](
114114
}
115115
}
116116

117-
case class StacOgcRepositories[F[_]: MonadThrow](
117+
case class StacOgcRepositories[F[_]: MonadThrow: Logger](
118118
stacLayers: List[StacSourceConf],
119119
client: SttpBackend[F, Any]
120120
) extends RepositoryM[F, List, OgcSource] {
@@ -128,7 +128,7 @@ case class StacOgcRepositories[F[_]: MonadThrow](
128128
def find(query: Query): F[List[OgcSource]] =
129129
StacOgcRepositories
130130
.eval(query)(stacLayers)
131-
.map { conf => StacOgcRepository(conf, SttpStacClient(client, uri"${conf.source}")) }
131+
.map { conf => StacOgcRepository(conf, StacClientLoggingMid[F] attach SttpStacClient(client, uri"${conf.source}")) }
132132
.fold(RepositoryM.empty[F, List, OgcSource])(_ |+| _)
133133
.find(query)
134134
}

stac-example/src/main/scala/geotrellis/server/ogc/stac/package.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,30 @@ package geotrellis.server.ogc
1919
import geotrellis.stac._
2020
import geotrellis.server.ogc.utils._
2121
import geotrellis.store.query._
22-
2322
import geotrellis.raster.{EmptyName, RasterSource, SourceName, StringName}
2423
import geotrellis.raster.geotiff.GeoTiffPath
24+
2525
import com.azavea.stac4s.{StacAsset, StacExtent}
2626
import com.azavea.stac4s.api.client.{SearchFilters, StacClient, Query => SQuery}
2727
import com.azavea.stac4s.extensions.periodic.PeriodicExtent
2828
import com.azavea.stac4s.syntax._
2929
import io.circe.syntax._
30-
import cats.{Applicative, Foldable, Functor, FunctorFilter, Monad}
30+
import cats.{Applicative, Foldable, Functor, FunctorFilter}
3131
import cats.data.NonEmptyList
3232
import cats.syntax.either._
3333
import cats.syntax.foldable._
34-
import cats.syntax.functor._
3534
import cats.syntax.functorFilter._
3635
import cats.syntax.applicative._
3736
import cats.syntax.functor._
3837
import cats.syntax.option._
38+
import cats.tagless.{ApplyK, Derive}
3939
import eu.timepit.refined.types.string.NonEmptyString
4040

4141
import java.time.ZoneOffset
4242

4343
package object stac {
44+
implicit val stacClientApplyK: ApplyK[StacClient] = Derive.applyK
45+
4446
implicit class StacExtentionOps(val self: StacExtent) extends AnyVal {
4547

4648
/** [[StacExtent]]s with no temporal component are valid. */

0 commit comments

Comments
 (0)