Documentation Index
Fetch the complete documentation index at: https://docs.blindference.xyz/llms.txt
Use this file to discover all available pages before exploring further.
Monitoring
Health Checks
ICL Health
curl -s $BLF_ICL_ENDPOINT/health | python3 -m json.tool
Expected response:
{
"status": "ok",
"chain_connected": true,
"mongo_connected": true
}
Node Status via ICL
# Check if your node is in the active pool
curl -s "$BLF_ICL_ENDPOINT/v1/nodes/active" | python3 -m json.tool | grep -A5 "your_address"
# Check node metrics
curl -s "$BLF_ICL_ENDPOINT/v1/nodes/{your_address}" | python3 -m json.tool
Expected metrics:
{
"operator_address": "0xdDef3Cf5A4d0A6404Bc084D74de3E2c0d6147dA5",
"model_tiers": [0],
"active": true,
"metrics": {
"tasks_completed": 42,
"tasks_accepted": 40,
"tasks_rejected": 2,
"reputation_score": 9520,
"total_slash_amount": 0,
"last_heartbeat": 1779078687
}
}
Local Node Logs
# Tail logs in real-time
tail -f ~/.blindference/node.log
# Or if running in foreground, logs go to stdout
grep -E "ERROR|WARNING" ~/.blindference/node.log
Key Metrics
1. Heartbeat Success Rate
# Count heartbeats in last hour
grep "Heartbeat sent" node.log | wc -l
# Expected: ~60 (1 per minute)
# Count heartbeat failures
grep "Heartbeat failed" node.log | wc -l
# Expected: 0
2. Job Assignment Rate
# Total jobs received
grep "Received.*assignment" node.log | wc -l
# Jobs by role
grep "starting as leader" node.log | wc -l
grep "starting as verifier" node.log | wc -l
# Job outcomes
grep "Leader result accepted" node.log | wc -l
grep "Verdict: match" node.log | wc -l
grep "Verdict: no-match" node.log | wc -l
# Average inference time (if logged at DEBUG level)
grep "Inference complete" node.log | awk '{print $NF}' | sort -n | awk '
{sum+=$1; count++}
END {print "Avg:", sum/count, "ms"}'
# Model usage distribution
grep "Running inference" node.log | sed 's/.*via //' | sort | uniq -c
4. CoFHE Operations
# Decrypt successes/failures
grep "Decrypted prompt key" node.log | wc -l
grep "CoFHE decrypt failed" node.log | wc -l
# IPFS operations
grep "Downloaded prompt blob" node.log | wc -l
grep "uploaded encrypted output" node.log | wc -l
Alerting
Simple Shell Script
#!/bin/bash
# check_node_health.sh
HEALTH=$(curl -s -o /dev/null -w "%{http_code}" $BLF_ICL_ENDPOINT/health)
if [ "$HEALTH" != "200" ]; then
echo "ALERT: ICL health check failed with status $HEALTH" | mail -s "Blindference Alert" admin@example.com
fi
# Check if node is in active pool
ACTIVE=$(curl -s "$BLF_ICL_ENDPOINT/v1/nodes/active" | grep -c "your_address")
if [ "$ACTIVE" -eq 0 ]; then
echo "ALERT: Node not in active pool" | mail -s "Blindference Alert" admin@example.com
fi
Run via cron every 5 minutes:
*/5 * * * * /path/to/check_node_health.sh
Prometheus / Grafana (Advanced)
For production deployments, expose metrics in Prometheus format:
# Add to node_loop.py
from prometheus_client import Counter, Histogram, start_http_server
jobs_completed = Counter('blindference_jobs_completed', 'Jobs completed', ['role'])
inference_duration = Histogram('blindference_inference_seconds', 'Inference duration')
heartbeat_failures = Counter('blindference_heartbeat_failures', 'Heartbeat failures')
# Start metrics server
start_http_server(9090)
Then scrape with Prometheus and visualize in Grafana.
Log Analysis
Blindference node logs use this format:
[YYYY-MM-DDTHH:MM:SS] [LEVEL ] [address] Message
Example:
[2026-05-18T10:25:00] [INFO ] [0xdDef3Cf5] Daemon starting ...
Parsing with jq
# Extract all ERROR lines
grep "ERROR" node.log | jq -R 'split("]") | {time: .[0], level: .[1], address: .[2], message: .[3]}'
# Count errors by type
grep "ERROR" node.log | sed 's/.*ERROR.*]//' | sort | uniq -c | sort -rn
Dashboard (Future)
A web-based node dashboard is planned for future releases. It will show:
- Real-time job queue
- Inference performance charts
- Earnings history
- Attestation status
- Reputation score trends
For now, use the CLI and log-based monitoring described above.