daml/ledger
Samir Talwar 3227e860e0
Use the port file and dynamic port generation in client/server tests. (#10604)
* Use the port file and dynamic port generation in client/server tests.

This creates a runner named `runner_with_port_file` which knows how to
interpolate two variables, `%PORT_FILE%` and `%PORT%`. This allows us to
use the `port-file` argument to the kvutils runner rather than
hard-coding a port for conformance tests.

For now, we only use this for generating the kvutils reference ledger
export.

CHANGELOG_BEGIN
CHANGELOG_END

* Simplify the runner_with_port_file considerably.

It doesn't need to check if the port is open; we trust that the process
will do it.

This also makes sure the port file will be cleaned up, and reduces the
number of dependencies by making use of more functions in `extra`.

* Simplify port file generation in the new client-server runner.

Co-authored-by: Moritz Kiefer <moritz.kiefer@purelyfunctional.org>

* Simplify the runner_with_port_file further.

This doesn't need to work if the server doesn't take a port file.

Co-authored-by: Moritz Kiefer <moritz.kiefer@purelyfunctional.org>
2021-08-18 13:25:58 +00:00
..
caching Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
cli-opts Upgrade scalafmt and enable trailing commas (#8437) 2021-01-09 11:37:37 +01:00
daml-on-sql Replace LedgerConfiguration with InitialLedgerConfiguration or the load timeout. [KVL-1058] (#10487) 2021-08-05 16:31:45 +00:00
indexer-benchmark IndexerBenchmark: an option for defining minimum update rate [DPP-541] (#10540) 2021-08-10 23:08:06 +02:00
ledger-api-akka Port damlc dependencies to Scala 2.13 (#8423) 2021-01-08 07:22:38 +01:00
ledger-api-auth Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
ledger-api-auth-client Enforce Java formatting style with google-java-format (#8686) 2021-01-29 16:50:18 +00:00
ledger-api-bench-tool Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
ledger-api-client Set ErrorInfo metadata flag for definite_answer [KVL-1005] (#10583) 2021-08-16 13:09:34 +00:00
ledger-api-common Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
ledger-api-domain Move DeduplicationPeriod to ledger-api-domain [KVL-1047] (#10590) 2021-08-18 13:34:26 +02:00
ledger-api-health Upgrade scalafmt and enable trailing commas (#8437) 2021-01-09 11:37:37 +01:00
ledger-api-test-tool ledger-api-test-tool: Split TransactionServiceIT into lots of suites. (#10585) 2021-08-17 14:52:54 +00:00
ledger-api-test-tool-on-canton Reactive canton conformance test aginst LF 1.13 (#10458) 2021-08-02 19:43:37 +02:00
ledger-configuration Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
ledger-grpc ledger-grpc: Fix the directory paths. [KVL-1005] (#10586) 2021-08-16 16:38:00 +00:00
ledger-offset ledger-offset: Move Offset to a new package. [KVL-1002] (#10296) 2021-07-15 17:53:03 +02:00
ledger-on-memory Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
ledger-on-sql Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
ledger-resources Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
metrics Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
participant-integration-api Move DeduplicationPeriod to ledger-api-domain [KVL-1047] (#10590) 2021-08-18 13:34:26 +02:00
participant-state Use the port file and dynamic port generation in client/server tests. (#10604) 2021-08-18 13:25:58 +00:00
participant-state-index participant-state: Remove the ParticipantId, PackageId, and Party aliases. [KVL-1002] (#10308) 2021-07-19 12:31:25 +00:00
participant-state-metrics Add flag to enable/disable command deduplication [KVL-1006] (#10518) 2021-08-11 09:27:25 +02:00
recovering-indexer-integration-tests Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
sandbox Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
sandbox-classic Move DeduplicationPeriod to ledger-api-domain [KVL-1047] (#10590) 2021-08-18 13:34:26 +02:00
sandbox-common Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
sandbox-on-x Upgrade Scalatest to v3.2.9. (#10576) 2021-08-12 23:19:35 +00:00
sandbox-perf Replace LedgerConfiguration with InitialLedgerConfiguration or the load timeout. [KVL-1058] (#10487) 2021-08-05 16:31:45 +00:00
test-common Reactive canton conformance test aginst LF 1.13 (#10458) 2021-08-02 19:43:37 +02:00
README.md Daml case and logo (#8433) 2021-01-08 12:50:15 +00:00

ledger

Home of our reference ledger implementation (Sandbox) and various ledger related libraries.

Logging

Logging Configuration

The Sandbox and Ledger API Server use Logback for logging configuration.

Log Files

The Sandbox logs at INFO level to standard out and to the file sandbox.log in the current working directory.

Log levels

As most Java libraries and frameworks, the Sandbox and Ledger API Server use INFO as the default logging level. This level is for minimal and important information (usually only startup and normal shutdown events). INFO level logging should not produce increasing volume of logging during normal operation.

WARN level should be used for transition between healthy/unhealthy state, or in other close to error scenarios.

DEBUG level should be turned on only when investigating issues in the system, and usually that means we want the trail loggers. Normal loggers at DEBUG level can be useful sometimes (e.g. Daml interpretation).

Metrics

Sandbox and Ledger API Server provide a couple of useful metrics:

Sandbox and Ledger API Server

The Ledger API Server exposes basic metrics for all gRPC services and some additional ones.

Metric NameDescription
LedgerApi.com.daml.ledger.api.v1.$SERVICE.$METHOD
A meter that tracks the number of calls to the respective service and method.
CommandSubmission.failedCommandInterpretations
A meter that tracks the failed command interpretations.
CommandSubmission.submittedTransactions
A timer that tracks the commands submitted to the backing ledger.

Indexer

Metric NameDescription
JdbcIndexer.processedStateUpdates
A timer that tracks duration of state update processing.
JdbcIndexer.lastReceivedRecordTime
A gauge that returns the last received record time in milliseconds since EPOCH.
JdbcIndexer.lastReceivedOffset
A gauge that returns that last received offset from the ledger.
JdbcIndexer.currentRecordTimeLag
A gauge that returns the difference between the Indexer's wallclock time and the last received record time in milliseconds.

Metrics Reporting

The Sandbox automatically makes all metrics available via JMX under the JMX domain com.daml.platform.sandbox.

When building an Indexer or Ledger API Server the implementer/ledger integrator is responsible to set up a MetricRegistry and a suitable metric reporting strategy that fits their needs.

Health Checks

Ledger API Server health checks

The Ledger API Server exposes health checks over the gRPC Health Checking Protocol. You can check the health of the overall server by making a gRPC request to grpc.health.v1.Health.Check.

You can also perform a streaming health check by making a request to grpc.health.v1.Health.Watch. The server will immediately send the current health of the Ledger API Server, and then send a new message whenever the health changes.

The ledger may optionally expose health checks for underlying services and connections; the names of the services are ledger-dependent. For example, the Sandbox exposes two service health checks:

  • the "index" service tests the health of the connection to the index database
  • the "write" service tests the health of the connection to the ledger database

To use these, make a request with the service field set to the name of the service. An unknown service name will result in a gRPC NOT_FOUND error.

Indexer health checks

The Indexer does not currently run a gRPC server, and so does not expose any health checks on its own.

In the situation where it is run in the same process as the Ledger API Server, the authors of the binary are encouraged to add specific health checks for the Indexer. This is the case in the Sandbox and Reference implementations.

Checking the server health in production

We encourage you to use the grpc-health-probe tool to periodically check the health of your Ledger API Server in production. On the command line, you can run it as follows (changing the address to match your ledger):

$ grpc-health-probe -addr=localhost:6865
status: SERVING

An example of how to naively configure Kubernetes to run the Sandbox, with accompanying health checks, can be found in sandbox/kubernetes.yaml.

More details can be found on the Kubernetes blog, in the post titled Health checking gRPC servers on Kubernetes.

gRPC and back-pressure

RPC

Standard RPC requests should return with RESOURCE_EXHAUSTED status code to signal back-pressure. Envoy can be configured to retry on these errors. We have to be careful not to have any persistent changes when returning with such an error as the same original request can be retried on another service instance.

Streaming

gRPC's streaming protocol has built-in flow-control, but it's not fully active by default. What it does it controls the flow between the TCP/HTTP layer and the library so it builds on top of TCP's own flow control. The inbound flow control is active by default, but the outbound does not signal back-pressure out of the box.

AutoInboundFlowControl: The default behaviour for handling incoming items in a stream is to automatically signal demand after every onNext call. This is the correct thing to do if the handler logic is CPU bound and does not depend on other reactive downstream services. By default it's active on all inbound streams. One can disable this and signal demand by manually calling request to follow demands of downstream services. Disabling this feature is possible by calling disableAutoInboundFlowControl on CallStreamObserver.

ServerCallStreamObserver: casting an outbound StreamObserver manually to ServerCallStreamObserver gives us access to isReady and onReadyHandler. With these methods we can check if there is available capacity in the channel i.e. we are safe to push into it. This can be used to signal demand to our upstream flow. Note that gRPC buffers 32Kb data per channel and isReady will return false only when this buffer gets full.