From 46d53e5f0cc63afaaee22ef13e3e353dc740113f Mon Sep 17 00:00:00 2001 From: Subh Date: Tue, 24 Jun 2025 20:46:41 +0530 Subject: [PATCH 1/5] feat: add OTEL service names to Docker services --- deploy/docker-compose.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 8f64733321..54b6592f76 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -1,6 +1,6 @@ services: cn1: - image: {{IMAGE}} + image: { { IMAGE } } volumes: - ./cn1.yaml:/home/ciphernode/.config/enclave/config.yaml:ro - cn1-data:/home/ciphernode/.local/share/enclave @@ -12,6 +12,7 @@ services: AGGREGATOR: "false" ADDRESS: "0xbDA5747bFD65F08deb54cb465eB87D40e51B197E" QUIC_PORT: 9091 + OTEL_SERVICE_NAME: "enclave-cn1" deploy: replicas: 1 endpoint_mode: dnsrr @@ -19,7 +20,7 @@ services: - global-network cn2: - image: {{IMAGE}} + image: { { IMAGE } } volumes: - ./cn2.yaml:/home/ciphernode/.config/enclave/config.yaml:ro - cn2-data:/home/ciphernode/.local/share/enclave @@ -29,8 +30,9 @@ services: env_file: .env environment: AGGREGATOR: "false" - ADDRESS: "0xdD2FD4581271e230360230F9337D5c0430Bf44C0" + ADDRESS: "0xdD2FD4581271e230360230F9337D5c0430Bf44C0" QUIC_PORT: 9092 + OTEL_SERVICE_NAME: "enclave-cn2" deploy: replicas: 1 endpoint_mode: dnsrr @@ -38,7 +40,7 @@ services: - global-network cn3: - image: {{IMAGE}} + image: { { IMAGE } } volumes: - ./cn3.yaml:/home/ciphernode/.config/enclave/config.yaml:ro - cn3-data:/home/ciphernode/.local/share/enclave @@ -50,6 +52,7 @@ services: AGGREGATOR: "false" ADDRESS: "0x2546BcD3c84621e976D8185a91A922aE77ECEc30" QUIC_PORT: 9093 + OTEL_SERVICE_NAME: "enclave-cn3" deploy: replicas: 1 endpoint_mode: dnsrr @@ -57,7 +60,7 @@ services: - global-network aggregator: - image: {{IMAGE}} + image: { { IMAGE } } depends_on: - cn1 volumes: @@ -71,6 +74,7 @@ services: AGGREGATOR: "true" ADDRESS: "0x8626a6940E2eb28930eFb4CeF49B2d1F2C9C1199" QUIC_PORT: 9094 + OTEL_SERVICE_NAME: "enclave-aggregator" deploy: replicas: 1 endpoint_mode: dnsrr @@ -85,7 +89,7 @@ secrets: secrets_cn3: file: cn3.secrets.json secrets_agg: - file: agg.secrets.json + file: agg.secrets.json volumes: cn1-data: From 6f5e4319b3d05aea0bf6c4dbfe19b2acf5bb1593 Mon Sep 17 00:00:00 2001 From: Subh Date: Tue, 24 Jun 2025 20:47:21 +0530 Subject: [PATCH 2/5] feat: add OTEL collector support via Docker overlay --- deploy/docker-compose.otel.yml | 1 + deploy/otel-collector-config-cloud-only.yaml | 45 ++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 deploy/docker-compose.otel.yml create mode 100644 deploy/otel-collector-config-cloud-only.yaml diff --git a/deploy/docker-compose.otel.yml b/deploy/docker-compose.otel.yml new file mode 100644 index 0000000000..0519ecba6e --- /dev/null +++ b/deploy/docker-compose.otel.yml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/deploy/otel-collector-config-cloud-only.yaml b/deploy/otel-collector-config-cloud-only.yaml new file mode 100644 index 0000000000..2924acfcca --- /dev/null +++ b/deploy/otel-collector-config-cloud-only.yaml @@ -0,0 +1,45 @@ +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + +processors: + batch: + timeout: 1s + send_batch_size: 1024 + +exporters: + debug: + verbosity: detailed + sampling_initial: 5 + sampling_thereafter: 200 + + otlp/signoz-cloud: + endpoint: "${SIGNOZ_ENDPOINT}" + tls: + insecure: false + headers: + "signoz-ingestion-key": "${SIGNOZ_INGESTION_KEY}" + +extensions: + health_check: + endpoint: 0.0.0.0:13133 + pprof: + endpoint: 0.0.0.0:1777 + zpages: + endpoint: 0.0.0.0:55679 + +service: + extensions: [health_check, pprof, zpages] + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [debug, otlp/signoz-cloud] + logs: + receivers: [otlp] + processors: [batch] + exporters: [debug, otlp/signoz-cloud] From 35eb9b6adf17a797a7f1d53a90df36c5c2aeb50b Mon Sep 17 00:00:00 2001 From: Subh Date: Tue, 24 Jun 2025 20:47:48 +0530 Subject: [PATCH 3/5] feat: add OTEL support to deployment script --- deploy/deploy.sh | 53 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 0825ecdade..42baeb0684 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash TIMESTAMP=$(date +%s) -RUN_FILE="./deploy/tmp.docker-compose.${TIMESTAMP}.yml" -TEMPLATE_FILE="./deploy/docker-compose.yml" +RUN_FILE="./tmp.docker-compose.${TIMESTAMP}.yml" +TEMPLATE_FILE="./docker-compose.yml" wait_ready() { local STACK_NAME="$1" @@ -24,30 +24,61 @@ wait_removed() { echo "Stack $STACK_NAME is removed" } +OTEL_ENDPOINT="" +while [[ $# -gt 0 ]]; do + case $1 in + --otel-endpoint) + OTEL_ENDPOINT="$2" + shift 2 + ;; + *) + if [ -z "$STACK_NAME" ]; then + STACK_NAME="$1" + elif [ -z "$IMAGE_NAME" ]; then + IMAGE_NAME="$1" + else + echo "Error: Unknown argument: $1" + echo "Usage: $0 [--otel-endpoint ]" + exit 1 + fi + shift + ;; + esac +done -if [ -z "$1" ]; then +if [ -z "$STACK_NAME" ]; then echo "Error: Please provide a stack name as an argument" - echo "Usage: $0 " + echo "Usage: $0 [--otel-endpoint ]" exit 1 fi -if [ -z "$2" ]; then +if [ -z "$IMAGE_NAME" ]; then echo "Error: Please provide an image name as an argument" - echo "Usage: $0 " + echo "Usage: $0 [--otel-endpoint ]" exit 1 fi -# Check if docker-compose.yml exists if [ ! -f "$TEMPLATE_FILE" ]; then echo "Error: $TEMPLATE_FILE not found" exit 1 fi -sed "s|{{IMAGE}}|$2|g" $TEMPLATE_FILE > "${RUN_FILE}" +sed "s|{{IMAGE}}|$IMAGE_NAME|g" $TEMPLATE_FILE > "${RUN_FILE}" + +COMPOSE_FILES="-c $RUN_FILE" +if [ -n "$OTEL_ENDPOINT" ] && [[ "$OTEL_ENDPOINT" == *"otel-collector"* ]]; then + echo "OTEL enabled with internal collector" + COMPOSE_FILES="$COMPOSE_FILES -c docker-compose.otel.yml" +elif [ -n "$OTEL_ENDPOINT" ]; then + echo "OTEL enabled with external endpoint: $OTEL_ENDPOINT" +else + echo "OTEL disabled" +fi -STACK_NAME=$1 docker stack rm $STACK_NAME wait_removed $STACK_NAME -docker stack deploy -c $RUN_FILE $STACK_NAME +docker stack deploy $COMPOSE_FILES $STACK_NAME wait_ready $STACK_NAME -rm ./deploy/tmp.*.* +rm ./tmp.*.* + +echo "✅ Stack '$STACK_NAME' deployed successfully!" From c199a5ac052858e36573cbd28b343d2ab14fa863 Mon Sep 17 00:00:00 2001 From: Subh Date: Tue, 24 Jun 2025 20:48:13 +0530 Subject: [PATCH 4/5] feat: add OTEL telemetry support --- crates/ciphernode-entrypoint.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/crates/ciphernode-entrypoint.sh b/crates/ciphernode-entrypoint.sh index 01679d4326..687106ed58 100644 --- a/crates/ciphernode-entrypoint.sh +++ b/crates/ciphernode-entrypoint.sh @@ -35,15 +35,25 @@ enclave password set --config "$CONFIG_FILE" --password "$PASSWORD" echo "Setting network private key" enclave net set-key --config "$CONFIG_FILE" --net-keypair "$NETWORK_PRIVATE_KEY" +OTEL_ARG="" +if [ -n "$OTEL_EXPORTER_OTLP_ENDPOINT" ]; then + OTEL_ARG="--otel $OTEL_EXPORTER_OTLP_ENDPOINT" + echo "OTEL telemetry enabled: $OTEL_EXPORTER_OTLP_ENDPOINT" +fi + +if [ -n "$OTEL_SERVICE_NAME" ]; then + echo "Service name for telemetry: $OTEL_SERVICE_NAME" +fi + if [ "$AGGREGATOR" = "true" ]; then echo "Setting private key" enclave wallet set --config "$CONFIG_FILE" --private-key "$PRIVATE_KEY" echo "Starting aggregator" - exec enclave start -v --config "$CONFIG_FILE" + exec enclave start -v --config "$CONFIG_FILE" $OTEL_ARG else echo "Starting Ciphernode" - exec enclave start -v --config "$CONFIG_FILE" + exec enclave start -v --config "$CONFIG_FILE" $OTEL_ARG fi From 59d9fc1d5aff62d2c7603713ce8884cda1b85e5f Mon Sep 17 00:00:00 2001 From: Subh Date: Tue, 24 Jun 2025 20:48:34 +0530 Subject: [PATCH 5/5] feat: use OTEL_SERVICE_NAME environment variable --- crates/ciphernode-entrypoint.sh | 5 ----- crates/cli/src/helpers/telemetry.rs | 6 +++--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/crates/ciphernode-entrypoint.sh b/crates/ciphernode-entrypoint.sh index 687106ed58..67fe47b828 100644 --- a/crates/ciphernode-entrypoint.sh +++ b/crates/ciphernode-entrypoint.sh @@ -1,12 +1,10 @@ #!/bin/bash set -e -# Paths to config and secrets CONFIG_FILE="$CONFIG_DIR/config.yaml" SECRETS_FILE="/run/secrets/secrets.json" AGGREGATOR="$AGGREGATOR" -# Ensure required files exist if [ ! -f "$CONFIG_FILE" ]; then echo "Error: Config file $CONFIG_FILE not found!" exit 1 @@ -17,7 +15,6 @@ if [ ! -f "$SECRETS_FILE" ]; then exit 1 fi -# Read secrets from the JSON file PRIVATE_KEY=$(jq -r '.private_key' "$SECRETS_FILE") PASSWORD=$(jq -r '.password' "$SECRETS_FILE") NETWORK_PRIVATE_KEY=$(jq -r '.network_private_key' "$SECRETS_FILE") @@ -27,11 +24,9 @@ if [ -z "$PRIVATE_KEY" ] || [ -z "$PASSWORD" ] || [ -z "$NETWORK_PRIVATE_KEY" ]; exit 1 fi -# Set password and private key echo "Setting password" enclave password set --config "$CONFIG_FILE" --password "$PASSWORD" -# Set network private key echo "Setting network private key" enclave net set-key --config "$CONFIG_FILE" --net-keypair "$NETWORK_PRIVATE_KEY" diff --git a/crates/cli/src/helpers/telemetry.rs b/crates/cli/src/helpers/telemetry.rs index 8fa5747748..aa5525378d 100644 --- a/crates/cli/src/helpers/telemetry.rs +++ b/crates/cli/src/helpers/telemetry.rs @@ -29,7 +29,9 @@ pub fn setup_tracing(config: &AppConfig, log_level: Level) -> Result<()> { .with_protocol(Protocol::Grpc) .build()?; - let resource = Resource::builder().with_service_name(name).build(); + let service_name = + std::env::var("OTEL_SERVICE_NAME").unwrap_or_else(|_| name.to_string()); + let resource = Resource::builder().with_service_name(service_name).build(); let provider = SdkTracerProvider::builder() .with_batch_exporter(otlp_exporter) @@ -48,8 +50,6 @@ pub fn setup_tracing(config: &AppConfig, log_level: Level) -> Result<()> { .init(); } None => { - // TODO: we might be able to dedupe this with above but there were - // issues with telemetry so have left this like so for now tracing_subscriber::registry() .with(tracing_subscriber::fmt::layer()) .with(tracing_subscriber::filter::LevelFilter::from_level(