logging-entries: Split from contextualized-logging. [KVL-996] (#10149)

* logging-entries: Split from contextualized-logging.

This allows us to introduce it to Daml-LF without bringing in the
Logback, Logstash, and gRPC dependencies.

CHANGELOG_BEGIN
CHANGELOG_END

* logging-entries: Fix dependencies for 2.12.

* logging-entries: Missed one more Scala 2.12 dependency.

* release: Publish logging-entries.
This commit is contained in:
Samir Talwar 2021-06-30 14:08:33 +02:00 committed by GitHub
parent f7cf7c75b5
commit c929a14486
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
45 changed files with 236 additions and 155 deletions

View File

@ -57,6 +57,7 @@ da_scala_library(
"//ledger/ledger-api-common",
"//libs-scala/auth-utils",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
],
)

View File

@ -72,6 +72,7 @@ hj_scalacopts = lf_scalacopts + [
"//libs-scala/concurrent",
"//libs-scala/contextualized-logging",
"//libs-scala/doobie-slf4j",
"//libs-scala/logging-entries",
"//libs-scala/ports",
"//libs-scala/resources",
"//libs-scala/scala-utils",
@ -252,6 +253,9 @@ alias(
"@maven//:org_typelevel_cats_core",
"@maven//:org_typelevel_cats_effect",
],
versioned_deps = {
"2.12": ["//libs-scala/logging-entries"],
},
visibility = ["//ledger-service:__subpackages__"],
deps = [
":http-json-{}".format(edition),

View File

@ -22,7 +22,10 @@ da_scala_library(
],
tags = ["maven_coordinates=com.daml:ledger-api-client:__VERSION__"],
versioned_deps = {
"2.12": ["//libs-scala/contextualized-logging"], # transient dependency, but 2.12 is confused
"2.12": [
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
],
},
visibility = [
"//visibility:public",
@ -128,6 +131,7 @@ da_scala_test_suite(
"//libs-scala/concurrent",
"//libs-scala/contextualized-logging",
"//libs-scala/grpc-utils",
"//libs-scala/logging-entries",
"//libs-scala/ports",
"//libs-scala/resources",
"@maven//:ch_qos_logback_logback_classic",

View File

@ -21,6 +21,9 @@ da_scala_library(
"@maven//:org_scalaz_scalaz_core",
],
tags = ["maven_coordinates=com.daml:ledger-api-common:__VERSION__"],
versioned_deps = {
"2.13": ["//libs-scala/logging-entries"],
},
visibility = [
"//visibility:public",
],
@ -71,6 +74,7 @@ da_scala_library(
"//ledger/ledger-api-domain",
"//libs-scala/concurrent",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"@maven//:io_zipkin_brave_brave",
],
)
@ -118,6 +122,7 @@ da_scala_test_suite(
"//libs-scala/concurrent",
"//libs-scala/contextualized-logging",
"//libs-scala/grpc-utils",
"//libs-scala/logging-entries",
"@maven//:ch_qos_logback_logback_classic",
"@maven//:ch_qos_logback_logback_core",
"@maven//:io_dropwizard_metrics_metrics_core",

View File

@ -20,7 +20,7 @@ da_scala_library(
"//daml-lf/data",
"//daml-lf/transaction",
"//ledger/participant-state",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"@maven//:io_zipkin_brave_brave",
],
)

View File

@ -12,8 +12,7 @@ import com.daml.lf.command.{Commands => LfCommands}
import com.daml.lf.data.Ref
import com.daml.lf.data.Ref.LedgerString.ordering
import com.daml.lf.value.{Value => Lf}
import com.daml.logging.LoggingValue
import com.daml.logging.LoggingValue.ToLoggingValue
import com.daml.logging.entries.{LoggingValue, ToLoggingValue}
import scalaz.syntax.tag._
import scalaz.{@@, Tag}

View File

@ -42,6 +42,7 @@ compile_deps = [
"//libs-scala/build-info",
"//libs-scala/contextualized-logging",
"//libs-scala/concurrent",
"//libs-scala/logging-entries",
"//libs-scala/ports",
"//libs-scala/resources",
"//libs-scala/resources-akka",
@ -173,6 +174,7 @@ da_scala_library(
"//ledger/participant-state-index",
"//ledger/test-common:dar-files-stable-lib",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"//libs-scala/oracle-testing",
"//libs-scala/ports",
"//libs-scala/postgresql-testing",
@ -259,6 +261,7 @@ da_scala_test_suite(
"//libs-scala/concurrent",
"//libs-scala/contextualized-logging",
"//libs-scala/grpc-utils",
"//libs-scala/logging-entries",
"//libs-scala/ports",
"//libs-scala/postgresql-testing",
"//libs-scala/resources",
@ -324,6 +327,7 @@ da_scala_test_suite(
"//ledger/participant-state",
"//ledger/participant-state-index",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"//libs-scala/oracle-testing",
"//libs-scala/ports",
"//libs-scala/resources",

View File

@ -16,7 +16,8 @@ import com.daml.ledger.api.v1.command_completion_service._
import com.daml.ledger.api.validation.PartyNameChecker
import com.daml.ledger.participant.state.index.v2.IndexCompletionsService
import com.daml.logging.LoggingContext.withEnrichedLoggingContext
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntries}
import com.daml.logging.entries.LoggingEntries
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.Metrics
import com.daml.platform.api.grpc.GrpcApiService
import com.daml.platform.server.api.services.domain.CommandCompletionService

View File

@ -16,7 +16,7 @@ import com.daml.ledger.api.domain.{
TransactionId,
WorkflowId,
}
import com.daml.logging.{LoggingEntries, LoggingEntry, LoggingValue}
import com.daml.logging.entries.{LoggingEntries, LoggingEntry, LoggingValue}
import scalaz.syntax.tag.ToTagOps
package object logging {

View File

@ -20,7 +20,8 @@ import com.daml.ledger.api.validation.PartyNameChecker
import com.daml.ledger.participant.state.index.v2.IndexTransactionsService
import com.daml.lf.data.Ref.Party
import com.daml.logging.LoggingContext.withEnrichedLoggingContext
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntries}
import com.daml.logging.entries.LoggingEntries
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.Metrics
import com.daml.platform.apiserver.services.transaction.ApiTransactionService._
import com.daml.platform.apiserver.services.{StreamMetrics, logging}

View File

@ -27,7 +27,8 @@ import com.daml.ledger.participant.state.v1.{
import com.daml.ledger.resources.ResourceOwner
import com.daml.lf.data.Time.Timestamp
import com.daml.logging.LoggingContext.withEnrichedLoggingContextFrom
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntries, LoggingEntry}
import com.daml.logging.entries.{LoggingEntries, LoggingEntry}
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.{Metrics, Timed}
import com.daml.platform.indexer.ExecuteUpdate.ExecuteUpdateFlow
import com.daml.platform.indexer.OffsetUpdate.PreparedTransactionInsert

View File

@ -27,7 +27,7 @@ import com.daml.ledger.participant.state.v1.{
WorkflowId,
}
import com.daml.lf.data.Time.Timestamp
import com.daml.logging.{LoggingEntries, LoggingEntry}
import com.daml.logging.entries.{LoggingEntries, LoggingEntry}
object IndexerLoggingContext {
def loggingEntriesFor(

View File

@ -27,7 +27,8 @@ import com.daml.lf.data.{Ref, Time}
import com.daml.lf.engine.ValueEnricher
import com.daml.lf.transaction.BlindingInfo
import com.daml.logging.LoggingContext.withEnrichedLoggingContext
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntry}
import com.daml.logging.entries.LoggingEntry
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.{Metrics, Timed}
import com.daml.platform.configuration.ServerRole
import com.daml.platform.indexer.{CurrentOffset, IncrementalOffsetStep, OffsetStep}

View File

@ -40,7 +40,8 @@ import com.daml.lf.data.Ref.{PackageId, Party}
import com.daml.lf.engine.ValueEnricher
import com.daml.lf.transaction.BlindingInfo
import com.daml.logging.LoggingContext.withEnrichedLoggingContext
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntry}
import com.daml.logging.entries.LoggingEntry
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.{Metrics, Timed}
import com.daml.platform.configuration.ServerRole
import com.daml.platform.indexer.{CurrentOffset, OffsetStep}
@ -58,13 +59,13 @@ import com.daml.platform.store.entries.{
PartyLedgerEntry,
}
import scalaz.syntax.tag._
import spray.json.DefaultJsonProtocol._
import spray.json._
import scala.concurrent.duration._
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Try
import scala.util.control.NonFatal
import spray.json._
import spray.json.DefaultJsonProtocol._
private final case class ParsedPartyData(
party: String,

View File

@ -31,7 +31,7 @@ da_scala_library(
"//ledger/ledger-api-health",
"//ledger/metrics",
"//ledger/participant-state/protobuf:ledger_configuration_proto_java",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"@maven//:com_google_protobuf_protobuf_java",
"@maven//:org_slf4j_slf4j_api",
],

View File

@ -59,6 +59,7 @@ da_scala_library(
"//ledger/participant-state/protobuf:ledger_configuration_proto_java",
"//libs-scala/concurrent",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"//libs-scala/resources",
"//libs-scala/resources-akka",
"//libs-scala/resources-grpc",
@ -117,6 +118,7 @@ da_scala_library(
"//ledger/test-common",
"//ledger/test-common:dar-files-stable-lib",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"//libs-scala/resources",
"@maven//:com_google_protobuf_protobuf_java",
"@maven//:io_dropwizard_metrics_metrics_core",
@ -175,6 +177,7 @@ da_scala_test_suite(
"//ledger/test-common",
"//ledger/test-common:dar-files-stable-lib",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"@maven//:com_google_guava_guava",
"@maven//:com_google_protobuf_protobuf_java",
"@maven//:io_dropwizard_metrics_metrics_core",

View File

@ -19,7 +19,8 @@ import com.daml.ledger.participant.state.v1.{Configuration, ParticipantId}
import com.daml.lf.data.Time
import com.daml.lf.data.Time.Timestamp
import com.daml.logging.LoggingContext.withEnrichedLoggingContextFrom
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntries}
import com.daml.logging.entries.LoggingEntries
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.Metrics
/** A committer either processes or pre-executes a submission, with its inputs into an ordered set of output state and

View File

@ -12,7 +12,8 @@ import com.daml.ledger.participant.state.kvutils.DamlKvutils._
import com.daml.ledger.participant.state.kvutils.committer.Committer._
import com.daml.ledger.participant.state.v1.Configuration
import com.daml.lf.data.Time.Timestamp
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntries}
import com.daml.logging.entries.LoggingEntries
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.Metrics
private[kvutils] object ConfigCommitter {

View File

@ -16,7 +16,8 @@ import com.daml.lf.data.Ref.PackageId
import com.daml.lf.data.Time.Timestamp
import com.daml.lf.engine.Engine
import com.daml.lf.language.Ast
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntries}
import com.daml.logging.entries.LoggingEntries
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.Metrics
import com.google.protobuf.ByteString

View File

@ -8,7 +8,8 @@ import com.daml.ledger.participant.state.kvutils.DamlKvutils._
import com.daml.ledger.participant.state.kvutils.committer.Committer.buildLogEntryWithOptionalRecordTime
import com.daml.lf.data.Ref
import com.daml.lf.data.Time.Timestamp
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntries}
import com.daml.logging.entries.LoggingEntries
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.Metrics
private[kvutils] object PartyAllocationCommitter {

View File

@ -32,7 +32,8 @@ import com.daml.lf.transaction.{
import com.daml.lf.value.Value
import com.daml.lf.value.Value.ContractId
import com.daml.logging.LoggingContext.withEnrichedLoggingContext
import com.daml.logging.{ContextualizedLogger, LoggingContext, LoggingEntries}
import com.daml.logging.entries.LoggingEntries
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.metrics.Metrics
import com.google.protobuf.{Timestamp => ProtoTimestamp}

View File

@ -14,7 +14,8 @@ import com.daml.ledger.participant.state.kvutils.{DamlKvutils, Err}
import com.daml.ledger.participant.state.protobuf.LedgerConfiguration
import com.daml.ledger.participant.state.v1.{Configuration, TimeModel}
import com.daml.lf.data.Time.Timestamp
import com.daml.logging.{LoggingContext, LoggingEntries}
import com.daml.logging.LoggingContext
import com.daml.logging.entries.LoggingEntries
import com.daml.metrics.Metrics
import org.mockito.MockitoSugar
import org.scalatest.matchers.should.Matchers

View File

@ -6,8 +6,7 @@ package com.daml.ledger.participant.state.v1
import java.io.InputStream
import com.daml.lf.data.{Bytes, Ref}
import com.daml.logging.LoggingValue
import com.daml.logging.LoggingValue.ToLoggingValue
import com.daml.logging.entries.{LoggingValue, ToLoggingValue}
/** Offsets into streams with hierarchical addressing.
*
@ -44,6 +43,6 @@ object Offset {
implicit object `Offset to LoggingValue` extends ToLoggingValue[Offset] {
override def apply(value: Offset): LoggingValue =
new LoggingValue.OfString(value.toHexString)
LoggingValue.OfString(value.toHexString)
}
}

View File

@ -18,6 +18,11 @@ da_scala_test_suite(
"@maven//:org_scalactic_scalactic",
"@maven//:org_scalatest_scalatest",
],
versioned_deps = {
"2.12": [
"//libs-scala/logging-entries",
],
},
runtime_deps = [
"@maven//:ch_qos_logback_logback_classic",
"@maven//:ch_qos_logback_logback_core",

View File

@ -82,6 +82,7 @@ alias(
"//libs-scala/build-info",
"//libs-scala/concurrent",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"//libs-scala/ports",
"//libs-scala/resources",
"//libs-scala/resources-akka",
@ -217,6 +218,7 @@ test_deps = [
"//libs-scala/contextualized-logging",
"//libs-scala/concurrent",
"//libs-scala/grpc-utils",
"//libs-scala/logging-entries",
"//libs-scala/ports",
"//libs-scala/postgresql-testing",
"//libs-scala/resources",

View File

@ -43,6 +43,7 @@ da_scala_library(
"//libs-scala/build-info",
"//libs-scala/concurrent",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"//libs-scala/ports",
"@maven//:ch_qos_logback_logback_classic",
"@maven//:com_auth0_java_jwt",
@ -137,6 +138,7 @@ da_scala_library(
"//ledger/test-common",
"//ledger/test-common:dar-files-stable-lib",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"//libs-scala/ports",
"//libs-scala/postgresql-testing",
"//libs-scala/resources",

View File

@ -4,7 +4,7 @@
package com.daml.platform.sandbox
import com.daml.ledger.participant.state.v1.ParticipantId
import com.daml.logging.LoggingEntry
import com.daml.logging.entries.LoggingEntry
package object logging {

View File

@ -24,6 +24,7 @@ da_scala_library(
],
deps = [
"//libs-scala/grpc-utils",
"//libs-scala/logging-entries",
"@maven//:com_fasterxml_jackson_core_jackson_core",
"@maven//:io_grpc_grpc_api",
"@maven//:net_logstash_logback_logstash_logback_encoder",
@ -48,6 +49,7 @@ da_scala_test_suite(
],
deps = [
":contextualized-logging",
"//libs-scala/logging-entries",
"@maven//:ch_qos_logback_logback_classic",
"@maven//:ch_qos_logback_logback_core",
"@maven//:com_fasterxml_jackson_core_jackson_core",

View File

@ -3,6 +3,7 @@
package com.daml.logging
import com.daml.logging.entries._
import net.logstash.logback.argument.StructuredArgument
import org.slf4j.Marker
@ -78,7 +79,7 @@ object LoggingContext {
final class LoggingContext private (entries: LoggingEntries) {
private lazy val forLogging: Marker with StructuredArgument =
entries.loggingMarker
new LoggingMarker(entries.contents)
private[logging] def ifEmpty(doThis: => Unit)(
ifNot: Marker with StructuredArgument => Unit

View File

@ -3,6 +3,8 @@
package com.daml.logging
import com.daml.logging.entries.{LoggingEntries, LoggingEntry}
import scala.annotation.nowarn
import scala.language.implicitConversions

View File

@ -3,6 +3,7 @@
package com.daml.logging
import com.daml.logging.entries.{LoggingKey, LoggingValue}
import com.fasterxml.jackson.core.JsonGenerator
import net.logstash.logback.argument.StructuredArgument
import net.logstash.logback.marker.LogstashMarker

View File

@ -1,66 +0,0 @@
// Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package com.daml.logging
import java.time.{Duration, Instant}
import scala.language.implicitConversions
sealed trait LoggingValue
object LoggingValue {
final object Empty extends LoggingValue
final object False extends LoggingValue
final object True extends LoggingValue
final case class OfString(value: String) extends LoggingValue
final case class OfInt(value: Int) extends LoggingValue
final case class OfLong(value: Long) extends LoggingValue
final case class OfIterable(sequence: Iterable[LoggingValue]) extends LoggingValue
final case class Nested(entries: LoggingEntries) extends LoggingValue
trait ToLoggingValue[-T] {
def apply(value: T): LoggingValue
}
@inline
implicit def from[T](value: T)(implicit toLoggingValue: ToLoggingValue[T]): LoggingValue =
toLoggingValue(value)
// This is not implicit because we only want to expose it for specific types.
val ToStringToLoggingValue: ToLoggingValue[Any] = value => OfString(value.toString)
implicit val `String to LoggingValue`: ToLoggingValue[String] = OfString(_)
implicit val `Boolean to LoggingValue`: ToLoggingValue[Boolean] = {
case false => False
case true => True
}
implicit val `Int to LoggingValue`: ToLoggingValue[Int] = OfInt(_)
implicit val `Long to LoggingValue`: ToLoggingValue[Long] = OfLong(_)
implicit val `Instant to LoggingValue`: ToLoggingValue[Instant] = ToStringToLoggingValue
implicit val `Duration to LoggingValue`: ToLoggingValue[Duration] = ToStringToLoggingValue
implicit def `Option[T] to LoggingValue`[T](implicit
elementToLoggingValue: ToLoggingValue[T]
): ToLoggingValue[Option[T]] = {
case None => Empty
case Some(value) => elementToLoggingValue(value)
}
implicit def `Iterable[T] to LoggingValue`[T](implicit
elementToLoggingValue: ToLoggingValue[T]
): ToLoggingValue[Iterable[T]] =
sequence => OfIterable(sequence.view.map(elementToLoggingValue.apply))
}

View File

@ -3,6 +3,7 @@
package com.daml.logging
import com.daml.logging.entries.LoggingValue
import com.fasterxml.jackson.core.JsonGenerator
private[logging] object LoggingValueSerializer {
@ -26,7 +27,7 @@ private[logging] object LoggingValueSerializer {
generator.writeEndArray()
case LoggingValue.Nested(entries) =>
generator.writeStartObject()
entries.loggingMarker.writeTo(generator)
new LoggingMarker(entries.contents).writeTo(generator)
generator.writeEndObject()
}
}

View File

@ -5,7 +5,4 @@ package com.daml
package object logging {
type LoggingContextOf[+P] = LoggingContextOf.Module.Instance.T[P]
type LoggingKey = String
type LoggingEntry = (LoggingKey, LoggingValue)
}

View File

@ -6,8 +6,8 @@ package com.daml.logging
import akka.actor.ActorSystem
import akka.stream.Materializer
import akka.stream.scaladsl.{Sink, Source}
import org.mockito.ArgumentMatchersSugar
import org.mockito.MockitoSugar
import com.daml.logging.entries.LoggingEntry
import org.mockito.{ArgumentMatchersSugar, MockitoSugar}
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.slf4j.event.{EventConstants, Level}

View File

@ -5,66 +5,67 @@ package com.daml.logging
import java.io.StringWriter
import com.daml.logging.LoggingValueSpec._
import com.daml.logging.LoggingValueSerializerSpec._
import com.daml.logging.entries.LoggingValue
import com.fasterxml.jackson.core.JsonFactory
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
class LoggingValueSpec extends AnyWordSpec with Matchers {
"a logging value" can {
"be constructed from the boolean `false`" in {
class LoggingValueSerializerSpec extends AnyWordSpec with Matchers {
"the serializer" can {
"serialize the boolean `false`" in {
val value = LoggingValue.from(false)
writingToGenerator(value) should be("false")
}
"be constructed from the boolean `true`" in {
"serialize the boolean `true`" in {
val value = LoggingValue.from(true)
writingToGenerator(value) should be("true")
}
"be constructed from a string" in {
"serialize a string" in {
val value = LoggingValue.from("foo bar")
writingToGenerator(value) should be("\"foo bar\"")
}
"be constructed from an int" in {
"serialize an int" in {
val value = LoggingValue.from(1981)
writingToGenerator(value) should be("1981")
}
"be constructed from a long" in {
"serialize a long" in {
val value = LoggingValue.from(Long.MaxValue)
writingToGenerator(value) should be("9223372036854775807")
}
"be constructed from a defined optional value" in {
"serialize a defined optional value" in {
val value = LoggingValue.from(Some(99))
writingToGenerator(value) should be("99")
}
"be constructed from an empty optional value" in {
"serialize an empty optional value" in {
val value = LoggingValue.from(None: Option[String])
writingToGenerator(value) should be("null")
}
"be constructed from a sequence" in {
"serialize a sequence" in {
val value = LoggingValue.from(Seq("a", "b", "c"))
writingToGenerator(value) should be("[\"a\",\"b\",\"c\"]")
}
"be constructed from an empty sequence" in {
"serialize an empty sequence" in {
val value = LoggingValue.from(Seq.empty[Long])
writingToGenerator(value) should be("[]")
}
"be constructed from a sequence view" in {
"serialize a sequence view" in {
val value = LoggingValue.from(Seq(1, 4, 7).view.map(_ * 2))
writingToGenerator(value) should be("[2,8,14]")
}
}
}
object LoggingValueSpec {
object LoggingValueSerializerSpec {
private val testJsonFactory = new JsonFactory
private def writingToGenerator(value: LoggingValue): String = {

View File

@ -0,0 +1,18 @@
# Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
load(
"//bazel_tools:scala.bzl",
"da_scala_library",
"da_scala_test_suite",
)
da_scala_library(
name = "logging-entries",
srcs = glob(["src/main/scala/**/*.scala"]),
scalacopts = ["-Xsource:2.13"],
tags = ["maven_coordinates=com.daml:logging-entries:__VERSION__"],
visibility = [
"//visibility:public",
],
)

View File

@ -1,14 +1,11 @@
// Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package com.daml.logging
package com.daml.logging.entries
import net.logstash.logback.argument.StructuredArgument
import org.slf4j.Marker
import scala.annotation.nowarn
final class LoggingEntries private (
private[logging] val contents: Map[LoggingKey, LoggingValue]
) extends AnyVal {
final case class LoggingEntries(contents: Map[LoggingKey, LoggingValue]) extends AnyVal {
def isEmpty: Boolean =
contents.isEmpty
@ -20,14 +17,16 @@ final class LoggingEntries private (
def ++(other: LoggingEntries): LoggingEntries =
new LoggingEntries(contents ++ other.contents)
private[logging] def loggingMarker: Marker with StructuredArgument =
new LoggingMarker(contents)
}
object LoggingEntries {
val empty: LoggingEntries = new LoggingEntries(Map.empty)
// Private so that it doesn't conflict with the other `apply` method.
@nowarn("msg=never used")
private def apply(entries: Map[LoggingKey, LoggingValue]): LoggingEntries =
new LoggingEntries(entries)
def apply(entries: LoggingEntry*): LoggingEntries =
new LoggingEntries(entries.toMap)

View File

@ -0,0 +1,30 @@
// Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package com.daml.logging.entries
import scala.language.implicitConversions
sealed trait LoggingValue
object LoggingValue {
object Empty extends LoggingValue
object False extends LoggingValue
object True extends LoggingValue
final case class OfString(value: String) extends LoggingValue
final case class OfInt(value: Int) extends LoggingValue
final case class OfLong(value: Long) extends LoggingValue
final case class OfIterable(sequence: Iterable[LoggingValue]) extends LoggingValue
final case class Nested(entries: LoggingEntries) extends LoggingValue
@inline
implicit def from[T](value: T)(implicit toLoggingValue: ToLoggingValue[T]): LoggingValue =
toLoggingValue(value)
}

View File

@ -0,0 +1,42 @@
// Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package com.daml.logging.entries
import java.time.{Duration, Instant}
trait ToLoggingValue[-T] {
def apply(value: T): LoggingValue
}
object ToLoggingValue {
// This is not implicit because we only want to expose it for specific types.
val ToStringToLoggingValue: ToLoggingValue[Any] = value => LoggingValue.OfString(value.toString)
implicit val `String to LoggingValue`: ToLoggingValue[String] = LoggingValue.OfString(_)
implicit val `Boolean to LoggingValue`: ToLoggingValue[Boolean] = {
case false => LoggingValue.False
case true => LoggingValue.True
}
implicit val `Int to LoggingValue`: ToLoggingValue[Int] = LoggingValue.OfInt(_)
implicit val `Long to LoggingValue`: ToLoggingValue[Long] = LoggingValue.OfLong(_)
implicit val `Instant to LoggingValue`: ToLoggingValue[Instant] = ToStringToLoggingValue
implicit val `Duration to LoggingValue`: ToLoggingValue[Duration] = ToStringToLoggingValue
implicit def `Option[T] to LoggingValue`[T](implicit
elementToLoggingValue: ToLoggingValue[T]
): ToLoggingValue[Option[T]] = {
case None => LoggingValue.Empty
case Some(value) => elementToLoggingValue(value)
}
implicit def `Iterable[T] to LoggingValue`[T](implicit
elementToLoggingValue: ToLoggingValue[T]
): ToLoggingValue[Iterable[T]] =
sequence => LoggingValue.OfIterable(sequence.view.map(elementToLoggingValue.apply))
}

View File

@ -0,0 +1,9 @@
// Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package com.daml.logging
package object entries {
type LoggingKey = String
type LoggingEntry = (LoggingKey, LoggingValue)
}

View File

@ -209,6 +209,8 @@
type: jar-scala
- target: //libs-scala/grpc-utils:grpc-utils
type: jar-scala
- target: //libs-scala/logging-entries:logging-entries
type: jar-scala
- target: //libs-scala/ports:ports
type: jar-scala
- target: //libs-scala/resources:resources

View File

@ -40,6 +40,7 @@ da_scala_library(
"//ledger/ledger-api-common",
"//libs-scala/auth-utils",
"//libs-scala/contextualized-logging",
"//libs-scala/logging-entries",
"//libs-scala/scala-utils",
],
)

View File

@ -3,57 +3,57 @@
package com.daml.lf.engine.trigger
import akka.NotUsed
import akka.stream._
import akka.stream.scaladsl._
import com.google.rpc.status.Status
import com.typesafe.scalalogging.StrictLogging
import io.grpc.StatusRuntimeException
import java.time.Instant
import java.util.UUID
import scalaz.{-\/, Functor, \/, \/-}
import scalaz.std.option._
import scalaz.syntax.bifunctor._
import scalaz.syntax.functor._
import scalaz.syntax.tag._
import scalaz.syntax.std.boolean._
import scalaz.syntax.std.option._
import scala.annotation.{nowarn, tailrec}
import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration.FiniteDuration
import scala.concurrent.duration._
import akka.NotUsed
import akka.stream._
import akka.stream.scaladsl._
import com.daml.api.util.TimeProvider
import com.daml.lf.{CompiledPackages, PureCompiledPackages}
import com.daml.lf.archive.Dar
import com.daml.lf.data.ImmArray
import com.daml.lf.data.Ref._
import com.daml.lf.data.ScalazEqual._
import com.daml.lf.data.Time.Timestamp
import com.daml.lf.language.Ast._
import com.daml.lf.speedy.{Compiler, Pretty, SExpr, SValue, Speedy}
import com.daml.lf.speedy.SExpr._
import com.daml.lf.speedy.SResult._
import com.daml.lf.speedy.SValue._
import com.daml.ledger.api.refinements.ApiTypes.ApplicationId
import com.daml.ledger.api.v1.command_submission_service.SubmitRequest
import com.daml.ledger.api.v1.commands.{Command, Commands}
import com.daml.ledger.api.v1.completion.Completion
import com.daml.ledger.api.v1.command_submission_service.SubmitRequest
import com.daml.ledger.api.v1.event._
import com.daml.ledger.api.v1.ledger_offset.LedgerOffset
import com.daml.ledger.api.v1.transaction.Transaction
import com.daml.ledger.api.v1.transaction_filter.{Filters, InclusiveFilters, TransactionFilter}
import com.daml.ledger.client.LedgerClient
import com.daml.ledger.client.services.commands.CompletionStreamElement._
import com.daml.logging.{ContextualizedLogger, LoggingContextOf, LoggingEntry, LoggingValue}
import LoggingContextOf.{label, newLoggingContext}
import com.daml.lf.archive.Dar
import com.daml.lf.data.ImmArray
import com.daml.lf.data.Ref._
import com.daml.lf.data.ScalazEqual._
import com.daml.lf.data.Time.Timestamp
import com.daml.lf.language.Ast._
import com.daml.lf.speedy.SExpr._
import com.daml.lf.speedy.SResult._
import com.daml.lf.speedy.SValue._
import com.daml.lf.speedy.{Compiler, Pretty, SExpr, SValue, Speedy}
import com.daml.lf.{CompiledPackages, PureCompiledPackages}
import com.daml.logging.LoggingContextOf.{label, newLoggingContext}
import com.daml.logging.entries.{LoggingEntry, LoggingValue}
import com.daml.logging.{ContextualizedLogger, LoggingContextOf}
import com.daml.platform.participant.util.LfEngineToApi.toApiIdentifier
import com.daml.platform.services.time.TimeProviderType
import com.daml.script.converter.Converter.{DamlAnyModuleRecord, DamlTuple2, unrollFree}
import com.daml.script.converter.Converter.Implicits._
import com.daml.script.converter.Converter.{DamlAnyModuleRecord, DamlTuple2, unrollFree}
import com.daml.script.converter.ConverterException
import com.google.protobuf.empty.Empty
import com.google.rpc.status.Status
import com.typesafe.scalalogging.StrictLogging
import io.grpc.StatusRuntimeException
import scalaz.std.option._
import scalaz.syntax.bifunctor._
import scalaz.syntax.functor._
import scalaz.syntax.std.boolean._
import scalaz.syntax.std.option._
import scalaz.syntax.tag._
import scalaz.{-\/, Functor, \/, \/-}
import scala.annotation.{nowarn, tailrec}
import scala.concurrent.duration.{FiniteDuration, _}
import scala.concurrent.{ExecutionContext, Future}
sealed trait TriggerMsg
final case class CompletionMsg(c: Completion) extends TriggerMsg
@ -454,7 +454,7 @@ class Runner(
val machine: Speedy.Machine =
Speedy.Machine.fromPureSExpr(compiledPackages, SEValue(SUnit))
import UnfoldState.{toSourceOps, toSource, flatMapConcatNodeOps, flatMapConcatNode}
import UnfoldState.{flatMapConcatNode, flatMapConcatNodeOps, toSource, toSourceOps}
val runInitialState = toSource(freeTriggerSubmits(clientTime, initialStateFree))
@ -580,7 +580,8 @@ class Runner(
// any other error will cause the trigger's stream to fail
}
}
import io.grpc.Status.Code, Code.RESOURCE_EXHAUSTED
import io.grpc.Status.Code
import Code.RESOURCE_EXHAUSTED
def retryableSubmit(req: SubmitRequest) =
submit(req).map {
case Some(SingleCommandFailure(_, s))

View File

@ -79,6 +79,7 @@ da_scala_library(
"//ledger/ledger-api-common",
"//libs-scala/contextualized-logging",
"//libs-scala/doobie-slf4j",
"//libs-scala/logging-entries",
"//libs-scala/scala-utils",
"//triggers/runner:trigger-runner-lib",
"//triggers/service/auth:middleware-api",