diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 15246c4..ee91874 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -28,7 +28,7 @@ jobs: - name: Publish collector locally run: | - git clone --branch 3.2.0 --depth 1 https://github.com/snowplow/stream-collector.git + git clone --branch 3.3.0 --depth 1 https://github.com/snowplow/stream-collector.git cd stream-collector sbt +publishLocal diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 39aff62..02c3eeb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: - name: Publish collector locally run: | - git clone --branch 3.2.0 --depth 1 https://github.com/snowplow/stream-collector.git + git clone --branch 3.3.0 --depth 1 https://github.com/snowplow/stream-collector.git cd stream-collector sbt +publishLocal diff --git a/CHANGELOG b/CHANGELOG index 0607801..83d8e86 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,11 @@ +Version 2.1.3 (2024-01-06) +-------------------------- +Change SLULA license from 1.0 to 1.1 +Upgrade enrich to 5.2.0 +Upgrade collector to 3.3.0 +Validate atomic fields lengths and JSON depth with Enrich defaults +Update instructions for local building + Version 2.1.2 (2024-08-27) -------------------------- Fix a regression with MICRO_IGLU_REGISTRY_URL diff --git a/LICENSE.md b/LICENSE.md index 6abbe69..0a7d3cc 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,18 +1,20 @@ # Snowplow Limited Use License Agreement -_Version 1.0, January 2024_ +_Version 1.1, November, 2024_ -This Snowplow Limited Use License Agreement, Version 1.0 (the “Agreement”) sets forth the terms on which Snowplow Analytics, Ltd. (“Snowplow”) makes available certain software (the “Software”). BY INSTALLING, DOWNLOADING, ACCESSING, OR USING ANY OF THE SOFTWARE, YOU AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE TO SUCH TERMS AND CONDITIONS, YOU MUST NOT USE THE SOFTWARE. IF YOU ARE RECEIVING THE SOFTWARE ON BEHALF OF A LEGAL ENTITY, YOU REPRESENT AND WARRANT THAT YOU HAVE THE ACTUAL AUTHORITY TO AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT ON BEHALF OF SUCH ENTITY. “Licensee” means you, an individual, or the entity on whose behalf you are receiving the Software. +This Snowplow Limited Use License Agreement, Version 1.1 (the “Agreement”) sets forth the terms on which Snowplow Analytics, Ltd. (“Snowplow”) makes available certain software (the “Software”). BY INSTALLING, DOWNLOADING, ACCESSING, OR USING ANY OF THE SOFTWARE, YOU AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE TO SUCH TERMS AND CONDITIONS, YOU MUST NOT USE THE SOFTWARE. IF YOU ARE RECEIVING THE SOFTWARE ON BEHALF OF A LEGAL ENTITY, YOU REPRESENT AND WARRANT THAT YOU HAVE THE ACTUAL AUTHORITY TO AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT ON BEHALF OF SUCH ENTITY. “Licensee” means you, an individual, or the entity on whose behalf you are receiving the Software. -## LICENSE GRANT AND CONDITIONS +## 1. LICENSE GRANT AND CONDITIONS -**1.1 License.** Subject to the terms and conditions of this Agreement, Snowplow hereby grants to Licensee a non-exclusive, royalty-free, worldwide, non-transferable, non-sublicensable license during the term of this Agreement to: (a) use the Software; (b) prepare modifications and derivative works of the Software; and (c) reproduce copies of the Software (the “License”). No right to distribute or make available the Software is granted under this License. Licensee is not granted the right to, and Licensee shall not, exercise the License for any Excluded Purpose. +**1.1 License.** Subject to the terms and conditions of this Agreement, Snowplow hereby grants to Licensee a non-exclusive, royalty-free, worldwide, non-transferable, non-sublicensable license during the term of this Agreement to: (a) use the Software; (b) prepare modifications and derivative works of the Software; and (c) reproduce copies of the Software (the “License”). No right to distribute or make available the Software is granted under this License. Licensee is not granted the right to, and Licensee shall not, exercise the License for any Competing Use, and Licensee may exercise the License only for Non-Production Use or Non-Commercial Use. -**1.2** For purposes of this Agreement, an “Excluded Purpose” is any use that is either a Competing Use or a Highly-Available Production Use, or both of them. +**1.2 Definitions.** For purposes of this Agreement: -* **1.2.1** A “Competing Use” is making available any on-premises or distributed software product, or any software-as-a-service, platform-as-a-service, infrastructure-as-a-service, or other similar online service, that competes with any products or services that Snowplow or any of its affiliates provides using the Software. +* **1.2.1** “Competing Use” is making available any on-premises or distributed software product, or any software-as-a-service, platform-as-a-service, infrastructure-as-a-service, or other similar online service, that competes with any products or services that Snowplow or any of its affiliates provides using the Software. -* **1.2.2** Highly-Available Production Use is any highly-available use, including without limitation any use where multiple instances of any Software component run concurrently to avoid a single point of failure, in a production environment, where production means use on live data. +* **1.2.2** “Non-Production Use” means any use of the Software to process test or synthetic data to evaluate the sufficiency of the Software for use by Licensee. + +* **1.2.3** “Non-Commercial Use” is only: (a) personal use for research, experiment, personal study, or hobby projects, without any anticipated commercial application, or (b) use for teaching purposes by lecturers of a school or university. **1.3 Conditions.** In consideration of the License, Licensee’s use of the Software is subject to the following conditions: @@ -22,8 +24,8 @@ This Snowplow Limited Use License Agreement, Version 1.0 (the “Agreement”) s ``` This software is made available by Snowplow Analytics, Ltd., - under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - located at https://docs.snowplow.io/limited-use-license-1.0 + under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + located at https://docs.snowplow.io/limited-use-license-1.1 BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. ``` @@ -32,23 +34,23 @@ This Snowplow Limited Use License Agreement, Version 1.0 (the “Agreement”) s **1.5 No Sublicensing.** The License does not include the right to sublicense the Software, however, each recipient to which Licensee provides the Software may exercise the Licenses so long as such recipient agrees to the terms and conditions of this Agreement. -## TERM AND TERMINATION +## 2. TERM AND TERMINATION This Agreement will continue unless and until earlier terminated as set forth herein. If Licensee breaches any of its conditions or obligations under this Agreement, this Agreement will terminate automatically and the License will terminate automatically and permanently. -## INTELLECTUAL PROPERTY +## 3. INTELLECTUAL PROPERTY As between the parties, Snowplow will retain all right, title, and interest in the Software, and all intellectual property rights therein. Snowplow hereby reserves all rights not expressly granted to Licensee in this Agreement. Snowplow hereby reserves all rights in its trademarks and service marks, and no licenses therein are granted in this Agreement. -## DISCLAIMER +## 4. DISCLAIMER SNOWPLOW HEREBY DISCLAIMS ANY AND ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, AND SPECIFICALLY DISCLAIMS ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, WITH RESPECT TO THE SOFTWARE. -## LIMITATION OF LIABILITY +## 5. LIMITATION OF LIABILITY SNOWPLOW WILL NOT BE LIABLE FOR ANY DAMAGES OF ANY KIND, INCLUDING BUT NOT LIMITED TO LOST PROFITS OR ANY CONSEQUENTIAL, SPECIAL, INCIDENTAL, INDIRECT, OR DIRECT DAMAGES, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ARISING OUT OF THIS AGREEMENT. THE FOREGOING SHALL APPLY TO THE EXTENT PERMITTED BY APPLICABLE LAW. -## GENERAL +## 6. GENERAL **6.1 Governing Law.** This Agreement will be governed by and interpreted in accordance with the laws of the state of Delaware, without reference to its conflict of laws principles. If Licensee is located within the United States, all disputes arising out of this Agreement are subject to the exclusive jurisdiction of courts located in Delaware, USA. If Licensee is located outside of the United States, any dispute, controversy or claim arising out of or relating to this Agreement will be referred to and finally determined by arbitration in accordance with the JAMS International Arbitration Rules. The tribunal will consist of one arbitrator. The place of arbitration will be in the State of Delaware, USA. The language to be used in the arbitral proceedings will be English. Judgment upon the award rendered by the arbitrator may be entered in any court having jurisdiction thereof. diff --git a/README.md b/README.md index 39f2bb9..ed88652 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Then clone the repository and publish the Collector dependency locally: git clone git@github.com:snowplow-incubator/snowplow-micro.git cd snowplow-micro -git clone --branch 3.2.0 --depth 1 git@github.com:snowplow/stream-collector.git +git clone --branch 3.3.0 --depth 1 git@github.com:snowplow/stream-collector.git cd stream-collector sbt +publishLocal && cd .. ``` @@ -60,7 +60,7 @@ Licensed under the [Snowplow Limited Use License Agreement][license]. _(If you a [gh-actions-image]: https://github.com/snowplow-incubator/snowplow-micro/actions/workflows/test.yml/badge.svg?branch=master [gh-releases]: https://github.com/snowplow-incubator/snowplow-micro/releases -[license]: https://docs.snowplow.io/limited-use-license-1.0 +[license]: https://docs.snowplow.io/limited-use-license-1.1 [license-image]: https://img.shields.io/badge/license-Snowplow--Limited--Use-blue.svg?style=flat [faq]: https://docs.snowplow.io/docs/contributing/limited-use-license-faq/ diff --git a/project/Dependencies.scala b/project/Dependencies.scala index bcfcb6d..20fb518 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -16,8 +16,8 @@ object Dependencies { object V { // Snowplow - val snowplowStreamCollector = "3.2.0" - val snowplowCommonEnrich = "4.2.0" + val snowplowStreamCollector = "3.3.0" + val snowplowCommonEnrich = "5.2.0" val http4sCirce = "0.23.23" val decline = "2.4.1" diff --git a/project/Settings.scala b/project/Settings.scala index 73bf107..9ba3e2d 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -25,13 +25,13 @@ import de.heikoseeberger.sbtheader.HeaderPlugin.autoImport._ object Settings { lazy val licenseSettings = Seq( - licenses += ("Snowplow Limited Use License Agreement", url("https://docs.snowplow.io/limited-use-license-1.0")), + licenses += ("Snowplow Limited Use License Agreement", url("https://docs.snowplow.io/limited-use-license-1.1")), headerLicense := Some(HeaderLicense.Custom( """|Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. | |This software is made available by Snowplow Analytics, Ltd., - |under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - |located at https://docs.snowplow.io/limited-use-license-1.0 + |under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + |located at https://docs.snowplow.io/limited-use-license-1.1 |BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION |OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. |""".stripMargin diff --git a/src/main/resources/collector-micro.conf b/src/main/resources/collector-micro.conf index dbc41f7..22d2e1a 100644 --- a/src/main/resources/collector-micro.conf +++ b/src/main/resources/collector-micro.conf @@ -1,8 +1,8 @@ # Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. # # This software is made available by Snowplow Analytics, Ltd., -# under the terms of the Snowplow Limited Use License Agreement, Version 1.0 -# located at https://docs.snowplow.io/limited-use-license-1.0 +# under the terms of the Snowplow Limited Use License Agreement, Version 1.1 +# located at https://docs.snowplow.io/limited-use-license-1.1 # BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION # OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. diff --git a/src/main/resources/default-iglu-resolver.conf b/src/main/resources/default-iglu-resolver.conf index 2c15a1e..ff05944 100644 --- a/src/main/resources/default-iglu-resolver.conf +++ b/src/main/resources/default-iglu-resolver.conf @@ -1,8 +1,8 @@ # Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. # # This software is made available by Snowplow Analytics, Ltd., -# under the terms of the Snowplow Limited Use License Agreement, Version 1.0 -# located at https://docs.snowplow.io/limited-use-license-1.0 +# under the terms of the Snowplow Limited Use License Agreement, Version 1.1 +# located at https://docs.snowplow.io/limited-use-license-1.1 # BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION # OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. diff --git a/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/EventConverter.scala b/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/EventConverter.scala index 096a445..a636166 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/EventConverter.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/EventConverter.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/GenericConverter.scala b/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/GenericConverter.scala index 2acfb21..81aa73b 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/GenericConverter.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/GenericConverter.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/RowConverter.scala b/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/RowConverter.scala index db0ab71..73a3317 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/RowConverter.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/RowConverter.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/ValueConverter.scala b/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/ValueConverter.scala index 33fd76f..bdd5f7b 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/ValueConverter.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/decode/ValueConverter.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/main/scala/com.snowplowanalytics.snowplow.micro/Configuration.scala b/src/main/scala/com.snowplowanalytics.snowplow.micro/Configuration.scala index 090ed34..c5d1d1b 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.micro/Configuration.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.micro/Configuration.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ @@ -22,7 +22,7 @@ import com.snowplowanalytics.iglu.core.circe.CirceIgluCodecs._ import com.snowplowanalytics.iglu.core.{SchemaKey, SchemaVer, SelfDescribingData} import com.snowplowanalytics.snowplow.collector.core.{Config => CollectorConfig} import com.snowplowanalytics.snowplow.enrich.common.adapters.{CallrailSchemas, CloudfrontAccessLogSchemas, GoogleAnalyticsSchemas, HubspotSchemas, MailchimpSchemas, MailgunSchemas, MandrillSchemas, MarketoSchemas, OlarkSchemas, PagerdutySchemas, PingdomSchemas, SendgridSchemas, StatusGatorSchemas, UnbounceSchemas, UrbanAirshipSchemas, VeroSchemas, AdaptersSchemas => EnrichAdaptersSchemas} -import com.snowplowanalytics.snowplow.enrich.common.enrichments.EnrichmentRegistry +import com.snowplowanalytics.snowplow.enrich.common.enrichments.{AtomicFields, EnrichmentRegistry} import com.snowplowanalytics.snowplow.enrich.common.enrichments.registry.EnrichmentConf import com.typesafe.config.{ConfigFactory, ConfigParseOptions, Config => TypesafeConfig} import fs2.io.file.{Files, Path => FS2Path} @@ -63,10 +63,15 @@ object Configuration { final case class MicroConfig(collector: CollectorConfig[SinkConfig], iglu: IgluResources, enrichmentsConfig: List[EnrichmentConf], - adaptersSchemas: AdaptersSchemas, + enrichConfig: EnrichConfig, outputEnrichedTsv: Boolean) - final case class AdaptersSchemas(adaptersSchemas: EnrichAdaptersSchemas) + final case class EnrichValidation(atomicFieldsLimits: AtomicFields) + final case class EnrichConfig( + adaptersSchemas: EnrichAdaptersSchemas, + maxJsonDepth: Int, + validation: EnrichValidation + ) final case class IgluResources(resolver: Resolver[IO], client: IgluCirceClient[IO]) @@ -76,10 +81,10 @@ object Configuration { Cli.config.map { cliConfig => for { collectorConfig <- loadCollectorConfig(cliConfig.collector) - igluResources <- loadIgluResources(cliConfig.iglu) + enrichConfig <- loadEnrichConfig() + igluResources <- loadIgluResources(cliConfig.iglu, enrichConfig.maxJsonDepth) enrichmentsConfig <- loadEnrichmentConfig(igluResources.client) - adaptersSchemas <- loadAdaptersSchemas() - } yield MicroConfig(collectorConfig, igluResources, enrichmentsConfig, adaptersSchemas, cliConfig.outputEnrichedTsv) + } yield MicroConfig(collectorConfig, igluResources, enrichmentsConfig, enrichConfig, cliConfig.outputEnrichedTsv) } } @@ -90,12 +95,12 @@ object Configuration { loadConfig[CollectorConfig[SinkConfig]](path, resolveOrder) } - private def loadIgluResources(path: Option[Path]): EitherT[IO, String, IgluResources] = { + private def loadIgluResources(path: Option[Path], maxJsonDepth: Int): EitherT[IO, String, IgluResources] = { val resolveOrder = (config: TypesafeConfig) => config.withFallback(ConfigFactory.parseResources("default-iglu-resolver.conf")) loadConfig[ResolverConfig](path, resolveOrder) - .flatMap(buildIgluResources) + .flatMap(resolverConfig => buildIgluResources(resolverConfig, maxJsonDepth)) } private def loadEnrichmentConfig(igluClient: IgluCirceClient[IO]): EitherT[IO, String, List[EnrichmentConf]] = { @@ -112,18 +117,18 @@ object Configuration { } } - private def loadAdaptersSchemas(): EitherT[IO, String, AdaptersSchemas] = { + def loadEnrichConfig(): EitherT[IO, String, EnrichConfig] = { val resolveOrder = (config: TypesafeConfig) => ConfigFactory.load(config) //It's not configurable in micro, we load it from reference.conf provided by enrich - loadConfig[AdaptersSchemas](path = None, resolveOrder) + loadConfig[EnrichConfig](path = None, resolveOrder) } - private def buildIgluResources(resolverConfig: ResolverConfig): EitherT[IO, String, IgluResources] = + private def buildIgluResources(resolverConfig: ResolverConfig, maxJsonDepth: Int): EitherT[IO, String, IgluResources] = for { resolver <- Resolver.fromConfig[IO](resolverConfig).leftMap(_.show) completeResolver = resolver.copy(repos = resolver.repos ++ readIgluExtraRegistry()) - client <- EitherT.liftF(IgluCirceClient.fromResolver[IO](completeResolver, resolverConfig.cacheSize)) + client <- EitherT.liftF(IgluCirceClient.fromResolver[IO](completeResolver, resolverConfig.cacheSize, maxJsonDepth)) } yield IgluResources(completeResolver, client) private def loadEnrichmentsAsSDD(enrichmentsDirectory: Path, @@ -226,8 +231,8 @@ object Configuration { implicit val resolverDecoder: Decoder[ResolverConfig] = Decoder.decodeJson.emap(json => Resolver.parseConfig(json).leftMap(_.show)) - implicit val adaptersSchemasDecoder: Decoder[AdaptersSchemas] = - deriveDecoder[AdaptersSchemas] + implicit val enrichConfigDecoder: Decoder[EnrichConfig] = + deriveDecoder[EnrichConfig] implicit val enrichAdaptersSchemasDecoder: Decoder[EnrichAdaptersSchemas] = deriveDecoder[EnrichAdaptersSchemas] implicit val callrailSchemasDecoder: Decoder[CallrailSchemas] = @@ -263,4 +268,18 @@ object Configuration { implicit val veroSchemasDecoder: Decoder[VeroSchemas] = deriveDecoder[VeroSchemas] + implicit val validationDecoder: Decoder[EnrichValidation] = + deriveDecoder[EnrichValidation] + implicit val atomicFieldsDecoder: Decoder[AtomicFields] = Decoder[Map[String, Int]].emap { fieldsLimits => + val configuredFields = fieldsLimits.keys.toList + val supportedFields = AtomicFields.supportedFields.map(_.name) + val unsupportedFields = configuredFields.diff(supportedFields) + + if (unsupportedFields.nonEmpty) + Left(s""" + |Configured atomic fields: ${unsupportedFields.mkString("[", ",", "]")} are not supported. + |Supported fields: ${supportedFields.mkString("[", ",", "]")}""".stripMargin) + else + Right(AtomicFields.from(fieldsLimits)) + } } diff --git a/src/main/scala/com.snowplowanalytics.snowplow.micro/Main.scala b/src/main/scala/com.snowplowanalytics.snowplow.micro/Main.scala index 5b7036f..2f645a1 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.micro/Main.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.micro/Main.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/main/scala/com.snowplowanalytics.snowplow.micro/MemorySink.scala b/src/main/scala/com.snowplowanalytics.snowplow.micro/MemorySink.scala index a0506a9..59785fd 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.micro/MemorySink.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.micro/MemorySink.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ @@ -21,12 +21,13 @@ import com.snowplowanalytics.snowplow.badrows.{BadRow, Failure, Payload, Process import com.snowplowanalytics.snowplow.collector.core.Sink import com.snowplowanalytics.snowplow.enrich.common.EtlPipeline import com.snowplowanalytics.snowplow.enrich.common.adapters.{AdapterRegistry, RawEvent} -import com.snowplowanalytics.snowplow.enrich.common.enrichments.{AtomicFields, EnrichmentManager, EnrichmentRegistry} +import com.snowplowanalytics.snowplow.enrich.common.enrichments.{EnrichmentManager, EnrichmentRegistry} import com.snowplowanalytics.snowplow.enrich.common.loaders.ThriftLoader import com.snowplowanalytics.snowplow.enrich.common.utils.ConversionUtils import io.circe.syntax._ import org.joda.time.DateTime import org.slf4j.LoggerFactory +import com.snowplowanalytics.snowplow.micro.Configuration.EnrichConfig /** Sink of the collector that Snowplow Micro is. * Contains the functions that are called for each tracking event sent @@ -40,10 +41,12 @@ final class MemorySink(igluClient: IgluCirceClient[IO], enrichmentRegistry: EnrichmentRegistry[IO], outputEnrichedTsv: Boolean, processor: Processor, - adapterRegistry: AdapterRegistry[IO]) extends Sink[IO] { + enrichConfig: EnrichConfig) extends Sink[IO] { override val maxBytes = Int.MaxValue private lazy val logger = LoggerFactory.getLogger("EventLog") + private val adapterRegistry = new AdapterRegistry[IO](Map.empty, enrichConfig.adaptersSchemas) + override def isHealthy: IO[Boolean] = IO.pure(true) override def storeRawEvents(events: List[Array[Byte]], key: String): IO[Unit] = { @@ -75,7 +78,7 @@ final class MemorySink(igluClient: IgluCirceClient[IO], case Validated.Valid(maybePayload) => maybePayload match { case Some(collectorPayload) => - adapterRegistry.toRawEvents(collectorPayload, igluClient, processor, registryLookup).flatMap { + adapterRegistry.toRawEvents(collectorPayload, igluClient, processor, registryLookup, enrichConfig.maxJsonDepth).flatMap { case Validated.Valid(rawEvents) => val partitionEvents = rawEvents.toList.foldLeftM((Nil, Nil): (List[GoodEvent], List[BadEvent])) { case ((good, bad), rawEvent) => @@ -135,8 +138,11 @@ final class MemorySink(igluClient: IgluCirceClient[IO], EtlPipeline.FeatureFlags(acceptInvalid = false, legacyEnrichmentOrder = false), IO.unit, registryLookup, - AtomicFields.from(Map.empty) + enrichConfig.validation.atomicFieldsLimits, + emitIncomplete = false, + enrichConfig.maxJsonDepth ) + .toEither .subflatMap { enriched => EventConverter.fromEnriched(enriched) .leftMap { failure => diff --git a/src/main/scala/com.snowplowanalytics.snowplow.micro/MicroHttpServer.scala b/src/main/scala/com.snowplowanalytics.snowplow.micro/MicroHttpServer.scala index 39a1687..6f03d62 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.micro/MicroHttpServer.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.micro/MicroHttpServer.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ @@ -19,9 +19,8 @@ import com.snowplowanalytics.snowplow.micro.Configuration.{MicroConfig, SinkConf import org.http4s.blaze.server.BlazeServerBuilder import org.http4s.headers.`Strict-Transport-Security` import org.http4s.server.Server -import org.http4s.server.middleware.{HSTS, Metrics, Timeout, Logger => LoggerMiddleware} +import org.http4s.server.middleware.{HSTS, Metrics, Timeout} import org.http4s.{HttpApp, HttpRoutes} -import org.typelevel.ci.CIString import org.typelevel.log4cats.Logger import org.typelevel.log4cats.slf4j.Slf4jLogger @@ -57,9 +56,7 @@ object MicroHttpServer { private def builder(routes: HttpRoutes[IO], config: CollectorConfig[SinkConfig]): BlazeServerBuilder[IO] = { BlazeServerBuilder[IO] - .withHttpApp( - loggerMiddleware(timeoutMiddleware(hstsMiddleware(config.hsts, routes.orNotFound), config.networking), config.debug.http) - ) + .withHttpApp(timeoutMiddleware(hstsMiddleware(config.hsts, routes.orNotFound), config.networking)) .withIdleTimeout(config.networking.idleTimeout) .withMaxConnections(config.networking.maxConnections) .withResponseHeaderTimeout(config.networking.responseHeaderTimeout) @@ -69,16 +66,6 @@ object MicroHttpServer { ) } - private def loggerMiddleware(routes: HttpApp[IO], config: CollectorConfig.Debug.Http): HttpApp[IO] = - if (config.enable) { - LoggerMiddleware.httpApp[IO]( - logHeaders = config.logHeaders, - logBody = config.logBody, - redactHeadersWhen = config.redactHeaders.map(CIString(_)).contains(_), - logAction = Some((msg: String) => Logger[IO].debug(msg)) - )(routes) - } else routes - private def timeoutMiddleware(routes: HttpApp[IO], networking: CollectorConfig.Networking): HttpApp[IO] = Timeout.httpApp[IO](timeout = networking.responseHeaderTimeout)(routes) diff --git a/src/main/scala/com.snowplowanalytics.snowplow.micro/Routing.scala b/src/main/scala/com.snowplowanalytics.snowplow.micro/Routing.scala index 8c234e7..ee552fe 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.micro/Routing.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.micro/Routing.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/main/scala/com.snowplowanalytics.snowplow.micro/Run.scala b/src/main/scala/com.snowplowanalytics.snowplow.micro/Run.scala index 96949a4..7bffcca 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.micro/Run.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.micro/Run.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ @@ -18,7 +18,6 @@ import com.snowplowanalytics.iglu.client.resolver.registries.JavaNetRegistryLook import com.snowplowanalytics.snowplow.badrows.Processor import com.snowplowanalytics.snowplow.collector.core._ import com.snowplowanalytics.snowplow.collector.core.model.Sinks -import com.snowplowanalytics.snowplow.enrich.common.adapters.AdapterRegistry import com.snowplowanalytics.snowplow.enrich.common.enrichments.EnrichmentRegistry import com.snowplowanalytics.snowplow.enrich.common.enrichments.registry.{Enrichment, EnrichmentConf} import com.snowplowanalytics.snowplow.enrich.common.utils.{HttpClient, ShiftExecution} @@ -56,9 +55,8 @@ object Run { sslContext <- Resource.eval(setupSSLContext()) enrichmentRegistry <- buildEnrichmentRegistry(config.enrichmentsConfig) badProcessor = Processor(BuildInfo.name, BuildInfo.version) - adapterRegistry = new AdapterRegistry[IO](Map.empty, config.adaptersSchemas.adaptersSchemas) lookup = JavaNetRegistryLookup.ioLookupInstance[IO] - sink = new MemorySink(config.iglu.client, lookup, enrichmentRegistry, config.outputEnrichedTsv, badProcessor, adapterRegistry) + sink = new MemorySink(config.iglu.client, lookup, enrichmentRegistry, config.outputEnrichedTsv, badProcessor, config.enrichConfig) collectorService = new Service[IO]( config.collector, Sinks(sink, sink), @@ -68,7 +66,6 @@ object Run { config.collector.enableDefaultRedirect, config.collector.rootResponse.enabled, config.collector.crossDomain.enabled, - config.collector.networking.bodyReadTimeout, collectorService ).value diff --git a/src/main/scala/com.snowplowanalytics.snowplow.micro/ValidationCache.scala b/src/main/scala/com.snowplowanalytics.snowplow.micro/ValidationCache.scala index 2de0766..3aaf635 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.micro/ValidationCache.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.micro/ValidationCache.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/main/scala/com.snowplowanalytics.snowplow.micro/model.scala b/src/main/scala/com.snowplowanalytics.snowplow.micro/model.scala index 9d9718c..bcfe84f 100644 --- a/src/main/scala/com.snowplowanalytics.snowplow.micro/model.scala +++ b/src/main/scala/com.snowplowanalytics.snowplow.micro/model.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/EventConverterSpec.scala b/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/EventConverterSpec.scala index 0e4fb2d..1847a93 100644 --- a/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/EventConverterSpec.scala +++ b/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/EventConverterSpec.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/test/scala/com.snowplowanalytics.snowplow.micro/ConfigHelperSpec.scala b/src/test/scala/com.snowplowanalytics.snowplow.micro/ConfigHelperSpec.scala index a738467..5a665a9 100644 --- a/src/test/scala/com.snowplowanalytics.snowplow.micro/ConfigHelperSpec.scala +++ b/src/test/scala/com.snowplowanalytics.snowplow.micro/ConfigHelperSpec.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/test/scala/com.snowplowanalytics.snowplow.micro/MemorySinkSpec.scala b/src/test/scala/com.snowplowanalytics.snowplow.micro/MemorySinkSpec.scala index a69b4e7..48f32e5 100644 --- a/src/test/scala/com.snowplowanalytics.snowplow.micro/MemorySinkSpec.scala +++ b/src/test/scala/com.snowplowanalytics.snowplow.micro/MemorySinkSpec.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ @@ -16,7 +16,6 @@ import com.snowplowanalytics.iglu.client.IgluCirceClient import com.snowplowanalytics.iglu.client.resolver.Resolver import com.snowplowanalytics.iglu.client.resolver.registries.{JavaNetRegistryLookup, Registry} import com.snowplowanalytics.snowplow.badrows.Processor -import com.snowplowanalytics.snowplow.enrich.common.adapters.AdapterRegistry import com.snowplowanalytics.snowplow.enrich.common.enrichments.EnrichmentRegistry import org.specs2.mutable.SpecificationLike @@ -162,12 +161,12 @@ class MemorySinkSpec extends CatsResource[IO, MemorySink] with SpecificationLike private def createSink(): IO[MemorySink] = { for { - igluClient <- IgluCirceClient.fromResolver[IO](Resolver(List(Registry.IgluCentral), None), 500) + enrichConfig <- Configuration.loadEnrichConfig().value.map(_.getOrElse(throw new IllegalArgumentException("Can't read defaults from Enrich config"))) + igluClient <- IgluCirceClient.fromResolver[IO](Resolver[IO](List(Registry.IgluCentral), None), 500, enrichConfig.maxJsonDepth) enrichmentRegistry = new EnrichmentRegistry[IO]() processor = Processor(BuildInfo.name, BuildInfo.version) - adapterRegistry = new AdapterRegistry[IO](Map.empty, TestAdapterRegistry.adaptersSchemas) lookup = JavaNetRegistryLookup.ioLookupInstance[IO] - } yield new MemorySink(igluClient, lookup, enrichmentRegistry, false, processor, adapterRegistry) + } yield new MemorySink(igluClient, lookup, enrichmentRegistry, false, processor, enrichConfig) } } diff --git a/src/test/scala/com.snowplowanalytics.snowplow.micro/MicroApiSpec.scala b/src/test/scala/com.snowplowanalytics.snowplow.micro/MicroApiSpec.scala index 5ca969c..f5ce3bf 100644 --- a/src/test/scala/com.snowplowanalytics.snowplow.micro/MicroApiSpec.scala +++ b/src/test/scala/com.snowplowanalytics.snowplow.micro/MicroApiSpec.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/test/scala/com.snowplowanalytics.snowplow.micro/TestAdapterRegistry.scala b/src/test/scala/com.snowplowanalytics.snowplow.micro/TestAdapterRegistry.scala index a4f9f97..5b9a72c 100644 --- a/src/test/scala/com.snowplowanalytics.snowplow.micro/TestAdapterRegistry.scala +++ b/src/test/scala/com.snowplowanalytics.snowplow.micro/TestAdapterRegistry.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/test/scala/com.snowplowanalytics.snowplow.micro/ValidationCacheSpec.scala b/src/test/scala/com.snowplowanalytics.snowplow.micro/ValidationCacheSpec.scala index 24d292a..52f80b2 100644 --- a/src/test/scala/com.snowplowanalytics.snowplow.micro/ValidationCacheSpec.scala +++ b/src/test/scala/com.snowplowanalytics.snowplow.micro/ValidationCacheSpec.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */ diff --git a/src/test/scala/com.snowplowanalytics.snowplow.micro/events.scala b/src/test/scala/com.snowplowanalytics.snowplow.micro/events.scala index ae5ffdc..27c2eef 100644 --- a/src/test/scala/com.snowplowanalytics.snowplow.micro/events.scala +++ b/src/test/scala/com.snowplowanalytics.snowplow.micro/events.scala @@ -2,8 +2,8 @@ * Copyright (c) 2019-present Snowplow Analytics Ltd. All rights reserved. * * This software is made available by Snowplow Analytics, Ltd., - * under the terms of the Snowplow Limited Use License Agreement, Version 1.0 - * located at https://docs.snowplow.io/limited-use-license-1.0 + * under the terms of the Snowplow Limited Use License Agreement, Version 1.1 + * located at https://docs.snowplow.io/limited-use-license-1.1 * BY INSTALLING, DOWNLOADING, ACCESSING, USING OR DISTRIBUTING ANY PORTION * OF THE SOFTWARE, YOU AGREE TO THE TERMS OF SUCH LICENSE AGREEMENT. */