Skip to content

Commit

Permalink
workbench: add & integrate cardano-tracer service
Browse files Browse the repository at this point in the history
  • Loading branch information
deepfire committed May 20, 2022
1 parent 9471d80 commit a909fc0
Show file tree
Hide file tree
Showing 12 changed files with 292 additions and 22 deletions.
10 changes: 5 additions & 5 deletions Makefile
Expand Up @@ -53,13 +53,13 @@ ps: ## Plain-text list of profiles
##
## Profile-based cluster shells (autogenerated targets)
##
SHELL_PROFILES += startstop startstop-oldtracing
SHELL_PROFILES += smoke 10 plutus
SHELL_PROFILES += startstop startstop-tracer startstop-oldtracing
SHELL_PROFILES += smoke 10 10-tracer plutus

SHELL_PROFILES += forge-stress forge-stress-plutus forge-stress-oldtracing
SHELL_PROFILES += forge-stress forge-stress-plutus forge-stress-tracer forge-stress-oldtracing

SHELL_PROFILES += chainsync-early-byron chainsync-early-byron-oldtracing
SHELL_PROFILES += chainsync-early-alonzo chainsync-early-alonzo-oldtracing
SHELL_PROFILES += chainsync-early-byron chainsync-early-byron-tracer chainsync-early-byron-oldtracing
SHELL_PROFILES += chainsync-early-alonzo chainsync-early-alonzo-tracer chainsync-early-alonzo-oldtracing

## Note: to enable a shell for a profile, just add its name (one of names from 'make ps') to SHELL_PROFILES

Expand Down
6 changes: 6 additions & 0 deletions nix/nixos/cardano-node-service.nix
Expand Up @@ -318,6 +318,12 @@ in {
description = ''Local communication socket path.'';
};

tracerSocketPath = mkOption {
type = types.nullOr types.str;
default = null;
description = ''Connect and forward traces to cardano-tracer's local socket.'';
};

systemdSocketActivation = mkOption {
type = types.bool;
default = false;
Expand Down
89 changes: 89 additions & 0 deletions nix/nixos/cardano-tracer-service.nix
@@ -0,0 +1,89 @@
pkgs:
let serviceConfigToJSON =
cfg:
{
networkMagic = 764824073; ## Mainnet
# loRequestNum = 100;
network =
if cfg.acceptingSocket != null
then {
tag = "AcceptAt";
contents = cfg.acceptingSocket;
} else if cfg.connectToSocket != null
then {
tag = "ConnectTo";
contents = cfg.connectToSocket;
} else
throw "cardano-tracer-service: either acceptingSocket or connectToSocket must be provided.";
logging = [{
inherit (cfg) logRoot;

logMode = "FileMode";
logFormat = "ForMachine";
}];
rotation = {
rpFrequencySecs = 15;
rpKeepFilesNum = 10;
rpLogLimitBytes = 500000000;
rpMaxAgeHours = 24;
};

hasEKG = [
{ epHost = "127.0.0.1";
epPort = 3100; ## supervisord.portShiftPrometheus
}
{ epHost = "127.0.0.1";
epPort = 3101; ## supervisord.portShiftPrometheus
}
];
ekgRequestFreq = 1;
hasPrometheus = {
epHost = "127.0.0.1";
epPort = 3200; ## supervisord.portShiftPrometheus
};
};
in pkgs.commonLib.defServiceModule
(lib: with lib;
{ svcName = "cardano-tracer";
svcDesc = "Cardano trace processor";

svcPackageSelector =
pkgs: ## Local:
pkgs.cardanoNodePackages.cardano-tracer
## Imported by another repo, that adds an overlay:
or pkgs.cardano-tracer;
## TODO: that's actually a bit ugly and could be improved.
## This exe has to be available in the selected package.
exeName = "cardano-tracer";

extraOptionDecls = {
### You can actually change those!
acceptingSocket = mayOpt str "Socket path: as acceptor.";
connectToSocket = mayOpt str "Socket path: connect to.";
logRoot = opt str null "Log storage root directory.";

### Here be dragons, on the other hand..
configFile = mayOpt str
"Config file path override -- only set if you know what you're doing. Shudder. Your 'eminence'..";
configJSONfn = opt (functionTo attrs) serviceConfigToJSON
"This is NOT meant to be overridden, at all -- we only expose it so it's externally accessible.";
};

configExeArgsFn = cfg: [
"--config" (if cfg.configFile != null then cfg.configFile
else "${pkgs.writeText "cardano-tracer-config.json"
(__toJSON (serviceConfigToJSON cfg))}")
];

configSystemdExtraConfig = _: {};

configSystemdExtraServiceConfig =
cfg: with cfg; {
Type = "exec";
User = "cardano-node";
Group = "cardano-node";
Restart = "yes";
# RuntimeDirectory = localNodeConf.runtimeDir;
# WorkingDirectory = localNodeConf.stateDir;
};
})
12 changes: 11 additions & 1 deletion nix/workbench/profile.nix
Expand Up @@ -26,14 +26,24 @@ pkgs.runCommand "workbench-profile-output-${profileNix.name}"
start = startupScript;
run-script = runScript.JSON;
};
passAsFile = [ "nodeServices" "generatorService" ];
tracerService =
with profileNix.tracer-service;
__toJSON
{ name = "tracer";
tracer-config = tracer-config.JSON;
nixos-service-config = nixos-service-config.JSON;
config = config.JSON;
start = startupScript;
};
passAsFile = [ "nodeServices" "generatorService" "tracerService" ];
}
''
mkdir $out
cp ${profileNix.JSON} $out/profile.json
cp ${backendProfile}/* $out
cp $nodeServicesPath $out/node-services.json
cp $generatorServicePath $out/generator-service.json
cp $tracerServicePath $out/tracer-service.json
wb profile node-specs $out/profile.json > $out/node-specs.json
''
5 changes: 5 additions & 0 deletions nix/workbench/profiles/default.nix
Expand Up @@ -54,6 +54,11 @@ let
./generator-service.nix
{ inherit runJq backend profile; })
generator-service;

inherit (pkgs.callPackage
./tracer-service.nix
{ inherit runJq backend profile; })
tracer-service;
};

in profile
1 change: 1 addition & 0 deletions nix/workbench/profiles/defaults.jq
Expand Up @@ -74,6 +74,7 @@ def era_defaults($era):
{ rts_flags_override: []
, shutdown_on_slot_synced: null
, tracing_backend: "trace-dispatcher" ## or "iohk-monitoring"
, tracer: true
}

, analysis:
Expand Down
112 changes: 112 additions & 0 deletions nix/workbench/profiles/tracer-service.nix
@@ -0,0 +1,112 @@
{ pkgs
, runJq

## The backend is an attrset of AWS/supervisord-specific methods and parameters.
, backend

, profile
}:

with pkgs.lib;

let
# We're reusing configuration from a cluster node.
nodes = profile.node-services;

##
## nodeSpecsTracerConfig :: Map NodeId NodeSpec -> TracerConfig
##
nodeSpecsTracerConfig =
nodeSpecs:
let
in
backend.finaliseTracerService
{
## In both the local and remote scenarios, it's most frequently convenient to act as an acceptor.
acceptingSocket = "tracer.socket";

## logRoot = ## ..really depends on context -- available in backend.finaliseTracerService

dsmPassthrough = {
# rtsOpts = ["-xc"];
};
};

## Given an env config, evaluate it and produce the service.
##
## tracerConfigServiceConfig :: TracerConfig -> NixosServiceConfig
##
tracerConfigServiceConfig =
tracerConfig:
let
systemdCompat.options = {
systemd.services = mkOption {};
systemd.sockets = mkOption {};
users = mkOption {};
assertions = mkOption {};
};
eval = let
extra = {
services.cardano-tracer = {
enable = true;
} // tracerConfig;
};
in evalModules {
prefix = [];
modules = import ../../nixos/module-list.nix ++ [
(import ../../nixos/cardano-tracer-service.nix pkgs)
systemdCompat extra
];
args = { inherit pkgs; };
};
in eval.config.services.cardano-tracer;

##
## generator-service :: (TracerConfig, NixosServiceConfig, Config, StartScript)
##
tracer-service =
(nodeSpecs:
let
tracerConfig = nodeSpecsTracerConfig nodeSpecs;
nixosServiceConfig = tracerConfigServiceConfig tracerConfig;
nixosServiceConfigFns = ["configJSONfn"];
execConfig = nixosServiceConfig.configJSONfn nixosServiceConfig;
in {
tracer-config = {
value = tracerConfig;
JSON = runJq "tracer-config.json"
''--null-input --sort-keys
--argjson x '${__toJSON tracerConfig}'
'' "$x";
};

nixos-service-config = {
## XXX: service == appallingly bad name -- it's bona-fide NixOS service "config", not a service!
value = nixosServiceConfig;
JSON = runJq "nixos-service-config.json"
''--null-input --sort-keys
--argjson x '${__toJSON (removeAttrs nixosServiceConfig nixosServiceConfigFns)}'
'' "$x";
};

config = rec {
value = execConfig;
JSON = runJq "config.json"
''--null-input
--argjson x '${__toJSON execConfig}'
'' "$x";
};

startupScript =
pkgs.writeScript "startup-tracer.sh"
''
#!${pkgs.stdenv.shell}
${nixosServiceConfig.script}
'';
})
profile.node-specs.value;
in
{
inherit tracer-service;
}
7 changes: 4 additions & 3 deletions nix/workbench/profiles/tracing.nix
Expand Up @@ -7,7 +7,7 @@
backends = [
"Stdout MachineFormat"
"EKGBackend"
# "Forwarder"
"Forwarder"
];
};
"Node.AcceptPolicy" = { severity = "Info"; };
Expand Down Expand Up @@ -44,9 +44,10 @@
};

TraceOptionForwarder = {
mode = "Responder";
# mode = "Responder";
mode = "Initiator";
address = {
filePath = "forwarder.sock";
filePath = "../tracer/tracer.socket";
};
};
}
44 changes: 31 additions & 13 deletions nix/workbench/profiles/variants.jq
Expand Up @@ -52,10 +52,10 @@ def all_profile_variants:
.alonzo.maxBlockExUnits.exUnitsMem = (62 * $M)) ## CAD-3991 CR.064
} as $plutus_next
|
# ####################################################################################################
# ##
# ### Status quo
# ##
####################################################################################################
##
### Status quo
##
$dataset_jun2022
as $current_dataset
|
Expand All @@ -72,10 +72,10 @@ def all_profile_variants:
$current_plutus
) as $status_quo
|
# ####################################################################################################
# ##
# ### Definition vocabulary
# ##
####################################################################################################
##
### Definition vocabulary
##
({}|
.generator.tps = 15
) as $saturation_tps_value
Expand All @@ -95,6 +95,16 @@ def all_profile_variants:
, n_dense_hosts: 0
}
} as $doublet
|
{ composition:
{ n_singular_hosts: 10
, n_dense_hosts: 0
}
} as $tenner
|
({}|
.node.tracer = true
) as $with_tracer
|
({}|
.node.tracing_backend = "iohk-monitoring"
Expand Down Expand Up @@ -226,6 +236,9 @@ def all_profile_variants:
, $startstop_base *
{ name: "startstop"
}
, $startstop_base * $with_tracer *
{ name: "startstop-tracer"
}
, $startstop_base * $old_tracing *
{ name: "startstop-oldtracing"
}
Expand All @@ -237,12 +250,11 @@ def all_profile_variants:
}
}

, $compressed *
, $fixed_loaded * $tenner *
{ name: "10"
, composition:
{ n_singular_hosts: 10
, n_dense_hosts: 0
}
}
, $fixed_loaded * $tenner * $with_tracer *
{ name: "10-tracer"
}

, $plutus *
Expand All @@ -261,13 +273,19 @@ def all_profile_variants:
{ tx_count: 800
}
}
, $forge_stress_base * $old_tracing * $with_tracer *
{ name: "forge-stress-tracer"
}
, $forge_stress_base * $old_tracing *
{ name: "forge-stress-oldtracing"
}

, $chainsync_base * $chaindb_early_byron *
{ name: "chainsync-early-byron"
}
, $chainsync_base * $chaindb_early_byron * $with_tracer *
{ name: "chainsync-early-byron-tracer"
}
, $chainsync_base * $chaindb_early_byron * $old_tracing *
{ name: "chainsync-early-byron-oldtracing"
}
Expand Down

0 comments on commit a909fc0

Please sign in to comment.