Skip to content

Commit

Permalink
feat: restore JVM metrics endpoint capability (#527)
Browse files Browse the repository at this point in the history
* feat: restore JVM metrics endpoint capability

* feat: move system controller to Tapir, simplify APISIX routing
  • Loading branch information
davidpoltorak-io committed May 19, 2023
1 parent 3b9437c commit 7d603f0
Show file tree
Hide file tree
Showing 14 changed files with 436 additions and 117 deletions.
63 changes: 9 additions & 54 deletions infrastructure/shared/apisix/conf/apisix.yaml
Expand Up @@ -2,87 +2,42 @@ plugins:
- name: proxy-rewrite

routes:
- uri: /prism-agent/_system/*
upstream_id: 3
plugins:
proxy-rewrite:
regex_uri: ["^/prism-agent/_system/(.*)", "/$1"]
- uri: /prism-agent/present-proof/*
upstream_id: 4
plugins:
proxy-rewrite:
regex_uri: ["^/prism-agent/present-proof/(.*)", "/present-proof/$1"]
- uri: /prism-agent/dids*
upstream_id: 4
plugins:
proxy-rewrite:
regex_uri: ["^/prism-agent/dids(/.*)?", "/dids$1"]
- uri: /prism-agent/did-registrar*
- uri: /prism-agent/*
upstream_id: 4
plugins:
proxy-rewrite:
regex_uri: ["^/prism-agent/did-registrar(/.*)?", "/did-registrar$1"]
- uri: /prism-agent/connections*
upstream_id: 4
plugins:
proxy-rewrite:
regex_uri: ["^/prism-agent/connections(/.*)?", "/connections$1"]
- uri: /prism-agent/connection-invitations
upstream_id: 4
plugins:
proxy-rewrite:
uri: "/connection-invitations"
- uri: /prism-agent/issue-credentials/*
regex_uri: ["^/prism-agent/(.*)", "/$1"]
- uri: /docs/prism-agent/api/*
upstream_id: 4
plugins:
proxy-rewrite:
regex_uri: ["^/prism-agent/issue-credentials/(.*)?", "/issue-credentials/$1"]
- uri: /didcomm
upstream_id: 3
plugins:
proxy-rewrite:
uri: "/"
- uri: /didcomm/did
# Get the default did:peer of the prism-agent (use to make a trust ping)
regex_uri: ["^/docs/prism-agent/api/(.*)", "/docs/$1"]
- uri: /didcomm*
upstream_id: 3
plugins:
proxy-rewrite:
uri: "/did"
- uri: /prism-agent/schema-registry/*
upstream_id: 4
plugins:
proxy-rewrite:
regex_uri: ["^/prism-agent/schema-registry/(.*)", "/schema-registry/$1"]
regex_uri: ["^/didcomm(.*)", "/$1"]
- uri: /mediator/*
upstream_id: 1
plugins:
proxy-rewrite:
regex_uri: ["^/mediator/(.*)", "/$1"]
- uri: /apidocs/*
upstream_id: 5
plugins:
proxy-rewrite:
regex_uri: ["^/apidocs/(.*)", "/$1"]
- uri: /docs/mediator/api/*
upstream_id: 1
plugins:
proxy-rewrite:
regex_uri: ["^/docs/mediator/api/(.*)", "/api/$1"]
- uri: /docs/prism-agent/api/*
upstream_id: 4
- uri: /apidocs/*
upstream_id: 5
plugins:
proxy-rewrite:
regex_uri: ["^/docs/prism-agent/api/(.*)", "/docs/$1"]
regex_uri: ["^/apidocs/(.*)", "/$1"]

upstreams:
- id: 1
nodes:
"mediator:8080": 1
type: roundrobin
# - id: 2
# nodes:
# "prism-agent:8080": 1 # api
# type: roundrobin
- id: 3
nodes:
"prism-agent:8090": 1 # didcom and system
Expand Down
Expand Up @@ -6,7 +6,6 @@ import io.circe.generic.auto.*
import io.circe.parser.*
import io.circe.syntax.*
import io.iohk.atala.agent.server.buildinfo.BuildInfo
import io.iohk.atala.agent.server.health.HealthInfo
import io.iohk.atala.agent.server.http.ZioHttpClient
import io.iohk.atala.agent.server.sql.Migrations as AgentMigrations
import io.iohk.atala.agent.walletapi.service.ManagedDIDService
Expand All @@ -20,6 +19,8 @@ import io.iohk.atala.pollux.core.service.CredentialSchemaServiceImpl
import io.iohk.atala.pollux.sql.repository.{JdbcCredentialSchemaRepository, Migrations as PolluxMigrations}
import io.iohk.atala.presentproof.controller.PresentProofControllerImpl
import io.iohk.atala.resolvers.{DIDResolver, UniversalDidResolver}
import io.iohk.atala.system.controller.SystemControllerImpl
import io.iohk.atala.system.controller.http.HealthInfo
import org.didcommx.didcomm.DIDComm
import org.flywaydb.core.extensibility.AppliedMigration
import zio.*
Expand All @@ -32,7 +33,7 @@ import zio.metrics.jvm.DefaultJvmMetrics

import java.security.Security

object AgentApp extends ZIOAppDefault {
object MainApp extends ZIOAppDefault {

Security.insertProviderAt(BouncyCastleProviderSingleton.getInstance(), 2)

Expand Down Expand Up @@ -60,7 +61,7 @@ object AgentApp extends ZIOAppDefault {
_ <- ZIO.logInfo(s"Server Started on port $didCommServicePort")
myServer <- {
Server
.serve(Modules.didCommServiceEndpoint ++ SystemInfoApp.app)
.serve(Modules.didCommServiceEndpoint)
.provideSomeLayer(server)
.debug *> ZIO.logWarning(s"Server STOP (on port $didCommServicePort)")
}.fork
Expand Down Expand Up @@ -140,7 +141,12 @@ object AgentApp extends ZIOAppDefault {
DIDControllerImpl.layer,
IssueControllerImpl.layer,
DIDRegistrarControllerImpl.layer,
PresentProofControllerImpl.layer
PresentProofControllerImpl.layer,
prometheus.prometheusLayer,
prometheus.publisherLayer,
ZLayer.succeed(MetricsConfig(5.seconds)),
DefaultJvmMetrics.live.unit,
SystemControllerImpl.layer
)
} yield app

Expand All @@ -152,5 +158,3 @@ object AgentApp extends ZIOAppDefault {
}

}

object MainApp extends ZIOApp.Proxy(DefaultJvmMetrics.app <> AgentApp)
Expand Up @@ -73,18 +73,19 @@ import java.io.IOException
import java.util.concurrent.Executors
import io.iohk.atala.mercury.protocol.trustping.TrustPing
import io.iohk.atala.castor.controller.{
DIDServerEndpoints,
DIDRegistrarServerEndpoints,
DIDController,
DIDRegistrarController
DIDRegistrarController,
DIDRegistrarServerEndpoints,
DIDServerEndpoints
}
import io.iohk.atala.agent.walletapi.crypto.Apollo
import io.iohk.atala.system.controller.{SystemController, SystemServerEndpoints}

object Modules {

lazy val zioApp: RIO[
CredentialSchemaController & VerificationPolicyController & ConnectionController & DIDController &
DIDRegistrarController & IssueController & PresentProofController & AppConfig,
DIDRegistrarController & IssueController & PresentProofController & SystemController & AppConfig,
Unit
] = {
val zioHttpServerApp = for {
Expand All @@ -95,8 +96,16 @@ object Modules {
allDIDEndpoints <- DIDServerEndpoints.all
allDIDRegistrarEndpoints <- DIDRegistrarServerEndpoints.all
allPresentProofEndpoints <- PresentProofServerEndpoints.all
allSystemEndpoints <- SystemServerEndpoints.all
allEndpoints = ZHttpEndpoints.withDocumentations[Task](
allSchemaRegistryEndpoints ++ allVerificationPolicyEndpoints ++ allConnectionEndpoints ++ allDIDEndpoints ++ allDIDRegistrarEndpoints ++ allIssueEndpoints ++ allPresentProofEndpoints
allSchemaRegistryEndpoints ++
allVerificationPolicyEndpoints ++
allConnectionEndpoints ++
allDIDEndpoints ++
allDIDRegistrarEndpoints ++
allIssueEndpoints ++
allPresentProofEndpoints ++
allSystemEndpoints
)
appConfig <- ZIO.service[AppConfig]
httpServer <- ZHttp4sBlazeServer.start(allEndpoints, port = appConfig.agent.httpEndpoint.http.port)
Expand Down

This file was deleted.

This file was deleted.

@@ -0,0 +1,13 @@
package io.iohk.atala.system.controller

import zio.{IO, ZIO}
import io.iohk.atala.api.http.{ErrorResponse, RequestContext}
import io.iohk.atala.system.controller.http.HealthInfo

trait SystemController {

def health()(implicit rc: RequestContext): IO[ErrorResponse, HealthInfo]

def metrics()(implicit rc: RequestContext): IO[ErrorResponse, String]

}
@@ -0,0 +1,28 @@
package io.iohk.atala.system.controller

import io.iohk.atala.agent.server.buildinfo.BuildInfo
import io.iohk.atala.api.http.{ErrorResponse, RequestContext}
import io.iohk.atala.system.controller.http.HealthInfo
import zio.http.Response
import zio.metrics.connectors.prometheus
import zio.metrics.connectors.prometheus.PrometheusPublisher
import zio.{IO, URLayer, ZIO, ZLayer}

class SystemControllerImpl(
prometheus: PrometheusPublisher
) extends SystemController {

override def health()(implicit rc: RequestContext): IO[ErrorResponse, HealthInfo] = {
ZIO.succeed(HealthInfo(version = BuildInfo.version))
}

override def metrics()(implicit rc: RequestContext): IO[ErrorResponse, String] = {
prometheus.get
}

}

object SystemControllerImpl {
val layer: URLayer[PrometheusPublisher, SystemController] =
ZLayer.fromFunction(SystemControllerImpl(_))
}
@@ -0,0 +1,65 @@
package io.iohk.atala.system.controller

import io.iohk.atala.api.http.EndpointOutputs.*
import io.iohk.atala.api.http.model.PaginationInput
import io.iohk.atala.api.http.{ErrorResponse, RequestContext}
import io.iohk.atala.connect.controller.http.{Connection, CreateConnectionRequest}
import io.iohk.atala.issue.controller.http.*
import io.iohk.atala.system.controller.http.HealthInfo
import sttp.model.StatusCode
import sttp.tapir.ztapir.stringBody
import sttp.tapir.json.zio.jsonBody
import sttp.tapir.{
Endpoint,
EndpointInfo,
EndpointInput,
PublicEndpoint,
endpoint,
extractFromRequest,
oneOf,
oneOfDefaultVariant,
oneOfVariant,
path,
query,
statusCode,
stringToPath
}
import zio.json.{DeriveJsonDecoder, DeriveJsonEncoder}

import java.util.UUID

object SystemEndpoints {

val health: PublicEndpoint[
(RequestContext),
ErrorResponse,
HealthInfo,
Any
] =
endpoint.get
.in(extractFromRequest[RequestContext](RequestContext.apply))
.in("_system" / "health")
.out(jsonBody[HealthInfo].description("The health info object."))
.errorOut(basicFailures)
.tag("System")
.summary("As a system user, check the health status of the running service")
.description("Returns the health info object of the running service")
.name("systemHealth")

val metrics: PublicEndpoint[
(RequestContext),
ErrorResponse,
String,
Any
] =
endpoint.get
.in(extractFromRequest[RequestContext](RequestContext.apply))
.in("_system" / "metrics")
.out(stringBody.description("The metrics as pain strings."))
.errorOut(basicFailures)
.tag("System")
.summary("As a system user, check the health status of the running service")
.description("Returns the health info object of the running service")
.name("systemMetrics")

}
@@ -0,0 +1,34 @@
package io.iohk.atala.system.controller

import io.iohk.atala.api.http.RequestContext
import io.iohk.atala.system.controller.SystemEndpoints.*
import sttp.tapir.ztapir.*
import zio.{URIO, ZIO}

class SystemServerEndpoints(systemController: SystemController) {

val healthEndpoint: ZServerEndpoint[Any, Any] =
health.zServerLogic { case (ctx: RequestContext) =>
systemController.health()(ctx)
}

val metricsEndpoint: ZServerEndpoint[Any, Any] =
metrics.zServerLogic { case (ctx: RequestContext) =>
systemController.metrics()(ctx)
}

val all: List[ZServerEndpoint[Any, Any]] = List(
healthEndpoint,
metricsEndpoint
)

}

object SystemServerEndpoints {
def all: URIO[SystemController, List[ZServerEndpoint[Any, Any]]] = {
for {
systemController <- ZIO.service[SystemController]
systemServerEndpoints = new SystemServerEndpoints(systemController)
} yield systemServerEndpoints.all
}
}

0 comments on commit 7d603f0

Please sign in to comment.