Skip to content

Commit 632ad21

Browse files
[ci] Add Http client metrics.
Signed-off-by: Raymond Roestenburg <[email protected]>
1 parent 9e392aa commit 632ad21

File tree

12 files changed

+130
-21
lines changed

12 files changed

+130
-21
lines changed

apps/app/src/main/scala/org/lfdecentralizedtrust/splice/console/ConsoleHttpCommandRunner.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package org.lfdecentralizedtrust.splice.console
55

6+
import com.daml.metrics.api.MetricsContext
67
import com.digitalasset.canton.config.{ConsoleCommandTimeout, NonNegativeDuration}
78
import com.digitalasset.canton.console.{
89
CommandErrors,
@@ -56,9 +57,10 @@ class ConsoleHttpCommandRunner(
5657
traceContext
5758
)
5859
val commandTimeout = commandTimeouts.bounded
59-
60+
// TODO check this.
61+
val metricsFactory = environment.metricsRegistry.generateMetricsFactory(MetricsContext.Empty)
6062
implicit val httpClient: HttpClient =
61-
HttpClient(HttpClient.HttpRequestParameters(requestTimeout), logger)
63+
HttpClient(HttpClient.HttpRequestParameters(requestTimeout), metricsFactory, logger)
6264

6365
val url = clientConfig.url
6466
try {

apps/app/src/main/scala/org/lfdecentralizedtrust/splice/console/ScanAppReference.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package org.lfdecentralizedtrust.splice.console
55

6+
import com.daml.metrics.api.MetricsContext
67
import org.apache.pekko.actor.ActorSystem
78
import org.lfdecentralizedtrust.splice.codegen.java.splice
89
import org.lfdecentralizedtrust.splice.codegen.java.splice.types.Round
@@ -752,7 +753,12 @@ final class ScanAppBackendReference(
752753
new ParticipantClientReference(
753754
spliceConsoleEnvironment,
754755
s"remote participant for `$name``",
755-
config.participantClient.getParticipantClientConfig(),
756+
// TODO this metricsRegistry stuff looks a but crazy - revisit
757+
config.participantClient.getParticipantClientConfig(
758+
spliceConsoleEnvironment.environment.metricsRegistry.generateMetricsFactory(
759+
MetricsContext.Empty
760+
)
761+
),
756762
)
757763

758764
/** Remote participant this scan app is configured to interact with. Uses admin tokens to bypass auth. */

apps/app/src/main/scala/org/lfdecentralizedtrust/splice/console/SplitwellReference.scala

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package org.lfdecentralizedtrust.splice.console
66
import org.apache.pekko.actor.ActorSystem
77
import com.daml.ledger.api.v2.CommandsOuterClass
88
import com.daml.ledger.javaapi.data.codegen.Update
9+
import com.daml.metrics.api.MetricsContext
910
import org.lfdecentralizedtrust.splice.codegen.java.splice.splitwell as splitwellCodegen
1011
import org.lfdecentralizedtrust.splice.codegen.java.splice.wallet.payment as walletCodegen
1112
import org.lfdecentralizedtrust.splice.codegen.java.da.time.types.RelTime
@@ -29,7 +30,7 @@ import com.digitalasset.canton.console.{
2930
LedgerApiCommandRunner,
3031
}
3132
import com.digitalasset.canton.console.commands.BaseLedgerApiAdministration
32-
import com.digitalasset.canton.topology.{SynchronizerId, PartyId}
33+
import com.digitalasset.canton.topology.{PartyId, SynchronizerId}
3334

3435
import scala.jdk.CollectionConverters.*
3536

@@ -93,7 +94,13 @@ final class SplitwellAppClientReference(
9394
config.participantClient.ledgerApi.clientConfig.address,
9495
config.participantClient.ledgerApi.clientConfig.port,
9596
config.participantClient.ledgerApi.clientConfig.tls,
96-
config.participantClient.ledgerApi.getToken().map(_.accessToken),
97+
// TODO This is not right, revisit
98+
config.participantClient.ledgerApi
99+
.getToken(
100+
spliceConsoleEnvironment.environment.metricsRegistry
101+
.generateMetricsFactory(MetricsContext.Empty)
102+
)
103+
.map(_.accessToken),
97104
)(consoleEnvironment)
98105

99106
val userId: String = config.ledgerApiUser
@@ -513,7 +520,12 @@ final class SplitwellAppBackendReference(
513520
new ParticipantClientReference(
514521
consoleEnvironment,
515522
s"remote participant for `$name``",
516-
config.participantClient.getParticipantClientConfig(),
523+
// TODO revisit
524+
config.participantClient.getParticipantClientConfig(
525+
spliceConsoleEnvironment.environment.metricsRegistry.generateMetricsFactory(
526+
MetricsContext.Empty
527+
)
528+
),
517529
)
518530

519531
/** Remote participant this splitwell app is configured to interact with. Uses admin tokens to bypass auth. */

apps/app/src/main/scala/org/lfdecentralizedtrust/splice/console/SvAppReference.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package org.lfdecentralizedtrust.splice.console
55

6+
import com.daml.metrics.api.MetricsContext
67
import org.lfdecentralizedtrust.splice.auth.AuthUtil
78
import org.lfdecentralizedtrust.splice.codegen.java.splice.round.OpenMiningRound
89
import org.lfdecentralizedtrust.splice.codegen.java.splice.dso.amuletprice as cp
@@ -408,7 +409,12 @@ class SvAppBackendReference(
408409
new ParticipantClientReference(
409410
consoleEnvironment,
410411
s"remote participant for `$name``",
411-
config.participantClient.getParticipantClientConfig(),
412+
// TODO this is not right - revisit
413+
config.participantClient.getParticipantClientConfig(
414+
spliceConsoleEnvironment.environment.metricsRegistry.generateMetricsFactory(
415+
MetricsContext.Empty
416+
)
417+
),
412418
)
413419

414420
/** Remote participant this sv app is configured to interact with. Uses admin tokens to bypass auth. */

apps/app/src/main/scala/org/lfdecentralizedtrust/splice/console/ValidatorAppReference.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package org.lfdecentralizedtrust.splice.console
55

6+
import com.daml.metrics.api.MetricsContext
67
import org.lfdecentralizedtrust.splice.auth.AuthUtil
78
import org.lfdecentralizedtrust.splice.codegen.java.splice.ans.AnsRules
89
import org.lfdecentralizedtrust.splice.codegen.java.splice.amuletrules as amuletrulesCodegen
@@ -37,8 +38,8 @@ import com.digitalasset.canton.topology.PartyId
3738
import org.apache.pekko.actor.ActorSystem
3839
import org.lfdecentralizedtrust.splice.codegen.java.splice.amuletrules.TransferPreapproval
3940
import org.lfdecentralizedtrust.splice.codegen.java.splice.api.token.{
40-
allocationv1,
4141
allocationinstructionv1,
42+
allocationv1,
4243
transferinstructionv1,
4344
}
4445
import org.lfdecentralizedtrust.splice.codegen.java.splice.externalpartyamuletrules.TransferCommandCounter
@@ -566,7 +567,12 @@ final class ValidatorAppBackendReference(
566567
new ParticipantClientReference(
567568
consoleEnvironment,
568569
s"remote participant for `$name`",
569-
config.participantClient.getParticipantClientConfig(),
570+
// TODO this is not right, revisit
571+
config.participantClient.getParticipantClientConfig(
572+
spliceConsoleEnvironment.environment.metricsRegistry.generateMetricsFactory(
573+
MetricsContext.Empty
574+
)
575+
),
570576
)
571577

572578
/** Remote participant this validator app is configured to interact with. Uses admin tokens to bypass auth. */

apps/app/src/test/scala/org/lfdecentralizedtrust/splice/unit/http/HttpClientProxyTest.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package org.lfdecentralizedtrust.splice.unit.http
22

33
import com.auth0.jwk.{JwkProvider, JwkProviderBuilder}
4+
import com.daml.metrics.api.MetricsContext
45
import com.digitalasset.canton.config.{ApiLoggingConfig, NonNegativeDuration}
56
import com.digitalasset.canton.logging.NamedLogging
7+
import com.digitalasset.canton.metrics.ScopedInMemoryMetricsFactory
68
import com.digitalasset.canton.{BaseTest, FutureHelpers, HasActorSystem, HasExecutionContext}
79
import com.typesafe.config.ConfigFactory
810
import org.apache.pekko.Done
@@ -30,7 +32,8 @@ class HttpClientProxyTest
3032
with TinyProxySupport
3133
with HttpServerSupport
3234
with SystemPropertiesSupport {
33-
35+
private val metricsFactoryProvider = new ScopedInMemoryMetricsFactory()
36+
private val metricsFactory = metricsFactoryProvider.generateMetricsFactory(MetricsContext.Empty)
3437
"HttpClient proxy settings" should {
3538
"support proxy configuration via http.proxyPort, http.proxyHost" in {
3639
withProxy() { proxy =>
@@ -168,6 +171,8 @@ class HttpClientProxyTest
168171
val api =
169172
new OAuthApi(
170173
NonNegativeDuration.ofSeconds(20),
174+
// TODO revisit metrics usage here
175+
metricsFactory,
171176
loggerFactory,
172177
)
173178
api.getWellKnown(wellKnownUrlString).futureValue shouldBe an[WellKnownResponse]
@@ -259,6 +264,7 @@ class HttpClientProxyTest
259264
val httpClient = HttpClient(
260265
ApiLoggingConfig(),
261266
HttpClient.HttpRequestParameters(NonNegativeDuration(30.seconds)),
267+
metricsFactory,
262268
logger,
263269
)(ac, ec)
264270
val uriString = s"http://localhost:$serverPort"

apps/common/src/main/scala/org/lfdecentralizedtrust/splice/auth/AuthTokenSource.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package org.lfdecentralizedtrust.splice.auth
55

66
import com.daml.jwt.{AuthServiceJWTCodec, Jwt, JwtDecoder, StandardJWTPayload}
7+
import com.daml.metrics.api.MetricHandle.LabeledMetricsFactory
78
import com.digitalasset.canton.config.NonNegativeDuration
89
import org.apache.pekko.actor.ActorSystem
910
import org.lfdecentralizedtrust.splice.auth.OAuthApi.TokenResponse
@@ -88,11 +89,12 @@ case class AuthTokenSourceOAuthClientCredentials(
8889
audience: String,
8990
scope: Option[String],
9091
requestTimeout: NonNegativeDuration,
92+
metricsFactory: LabeledMetricsFactory,
9193
override protected val loggerFactory: NamedLoggerFactory,
9294
)(implicit ec: ExecutionContext, ac: ActorSystem)
9395
extends AuthTokenSource
9496
with NamedLogging {
95-
private val oauth = new OAuthApi(requestTimeout, loggerFactory)
97+
private val oauth = new OAuthApi(requestTimeout, metricsFactory, loggerFactory)
9698

9799
override def getToken(implicit tc: TraceContext): Future[Option[AuthToken]] = {
98100
for {
@@ -113,6 +115,7 @@ case class AuthTokenSourceOAuthClientCredentials(
113115
object AuthTokenSource {
114116
def fromConfig(
115117
config: AuthTokenSourceConfig,
118+
metricsFactory: LabeledMetricsFactory,
116119
loggerFactory: NamedLoggerFactory,
117120
)(implicit ec: ExecutionContext, ac: ActorSystem): AuthTokenSource = config match {
118121
case AuthTokenSourceConfig.None() =>
@@ -134,6 +137,7 @@ object AuthTokenSource {
134137
wellKnownConfigUrl = wellKnownConfigUrl,
135138
clientId = clientId,
136139
clientSecret = clientSecret,
140+
metricsFactory = metricsFactory,
137141
loggerFactory = loggerFactory,
138142
audience = audience,
139143
scope = scope,

apps/common/src/main/scala/org/lfdecentralizedtrust/splice/auth/OAuthApi.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package org.lfdecentralizedtrust.splice.auth
55

6+
import com.daml.metrics.api.MetricHandle.LabeledMetricsFactory
67
import com.digitalasset.canton.config.{ApiLoggingConfig, NonNegativeDuration}
78
import org.apache.pekko.actor.ActorSystem
89
import org.apache.pekko.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
@@ -65,6 +66,7 @@ trait OAuthApiJson extends SprayJsonSupport with DefaultJsonProtocol {
6566

6667
class OAuthApi(
6768
requestTimeout: NonNegativeDuration,
69+
metricsFactory: LabeledMetricsFactory,
6870
override protected val loggerFactory: NamedLoggerFactory,
6971
)(implicit actorSystem: ActorSystem)
7072
extends OAuthApiJson
@@ -75,6 +77,7 @@ class OAuthApi(
7577
private val httpClient = HttpClient(
7678
ApiLoggingConfig(),
7779
HttpClient.HttpRequestParameters(requestTimeout),
80+
metricsFactory,
7881
logger,
7982
)
8083

apps/common/src/main/scala/org/lfdecentralizedtrust/splice/config/CNRemoteParticipantConfig.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package org.lfdecentralizedtrust.splice.config
55

6+
import com.daml.metrics.api.MetricHandle.LabeledMetricsFactory
67
import org.apache.pekko.actor.ActorSystem
78
import com.digitalasset.canton.config.FullClientConfig
89
import com.digitalasset.canton.participant.config.{BaseParticipantConfig, RemoteParticipantConfig}
@@ -14,8 +15,10 @@ abstract class BaseParticipantClientConfig(
1415
override def clientAdminApi: FullClientConfig = adminApi
1516
override def clientLedgerApi: FullClientConfig = ledgerApi.clientConfig
1617

17-
def getParticipantClientConfig()(implicit actorSystem: ActorSystem): RemoteParticipantConfig = {
18-
val tokenStrO = ledgerApi.getToken().map(_.accessToken)
18+
def getParticipantClientConfig(
19+
metricsFactory: LabeledMetricsFactory
20+
)(implicit actorSystem: ActorSystem): RemoteParticipantConfig = {
21+
val tokenStrO = ledgerApi.getToken(metricsFactory).map(_.accessToken)
1922
RemoteParticipantConfig(adminApi, ledgerApi.clientConfig, tokenStrO)
2023
}
2124

apps/common/src/main/scala/org/lfdecentralizedtrust/splice/config/LedgerApiClientConfig.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package org.lfdecentralizedtrust.splice.config
55

6+
import com.daml.metrics.api.MetricHandle.LabeledMetricsFactory
67
import com.digitalasset.canton.config.FullClientConfig
78
import com.digitalasset.canton.logging.NamedLoggerFactory
89
import com.digitalasset.canton.tracing.TraceContext
@@ -22,12 +23,15 @@ case class LedgerApiClientConfig(
2223
// Note: Some places, e.g., Cantons RemoteParticipantConfig expects a static token,
2324
// LedgerApiClientConfig contains information for how to acquire tokens.
2425
// We need to perform some blocking IO to generate the token here.
25-
def getToken()(implicit actorSystem: ActorSystem): Option[AuthToken] = {
26+
def getToken(
27+
metricsFactory: LabeledMetricsFactory
28+
)(implicit actorSystem: ActorSystem): Option[AuthToken] = {
2629
implicit val executionContext = actorSystem.dispatcher
2730
implicit val traceContext = TraceContext.empty
2831
val loggerFactory = NamedLoggerFactory.root
2932
val authTokenSource = AuthTokenSource.fromConfig(
3033
authConfig,
34+
metricsFactory,
3135
loggerFactory,
3236
)
3337
Await.result(authTokenSource.getToken, 30.seconds)

0 commit comments

Comments
 (0)