- Implemented `run-scanner-ci.sh` to build and run tests for the Scanner solution with a warmed NuGet cache. - Created `excititor-vex-traces.json` dashboard for monitoring Excititor VEX observations. - Added Docker Compose configuration for the OTLP span sink in `docker-compose.spansink.yml`. - Configured OpenTelemetry collector in `otel-spansink.yaml` to receive and process traces. - Developed `run-spansink.sh` script to run the OTLP span sink for Excititor traces. - Introduced `FileSystemRiskBundleObjectStore` for storing risk bundle artifacts in the filesystem. - Built `RiskBundleBuilder` for creating risk bundles with associated metadata and providers. - Established `RiskBundleJob` to execute the risk bundle creation and storage process. - Defined models for risk bundle inputs, entries, and manifests in `RiskBundleModels.cs`. - Implemented signing functionality for risk bundle manifests with `HmacRiskBundleManifestSigner`. - Created unit tests for `RiskBundleBuilder`, `RiskBundleJob`, and signing functionality to ensure correctness. - Added filesystem artifact reader tests to validate manifest parsing and artifact listing. - Included test manifests for egress scenarios in the task runner tests. - Developed timeline query service tests to verify tenant and event ID handling.
Signals CI/CD & Local Stack (DEVOPS-SIG-26-001)
Artifacts:
- Compose stack:
ops/devops/signals/docker-compose.signals.yml(Signals API + Mongo + Redis + artifact volume). - Sample config:
ops/devops/signals/signals.yaml(mounted into the container at/app/signals.yamlif desired). - Dockerfile:
ops/devops/signals/Dockerfile(multi-stage build on .NET 10 RC). - Build/export helper:
scripts/signals/build.sh(saves image tar toout/signals/signals-image.tar). - Span sink stack:
ops/devops/signals/docker-compose.spansink.yml+otel-spansink.yamlto collect OTLP traces (Excititor/v1/vex/observations/**) and write NDJSON tospansink-datavolume. Run viascripts/signals/run-spansink.sh. - Grafana dashboard stub:
ops/devops/signals/dashboards/excititor-vex-traces.json(import into Tempo-enabled Grafana).
Quick start (offline-friendly):
# build image
scripts/signals/build.sh
# run stack
COMPOSE_FILE=ops/devops/signals/docker-compose.signals.yml docker compose up -d
# hit health
curl -s http://localhost:5088/health
# run span sink collector
scripts/signals/run-spansink.sh
Configuration (ENV or YAML):
Signals__Mongo__ConnectionStringdefaultmongodb://signals-mongo:27017/signalsSignals__Cache__ConnectionStringdefaultsignals-redis:6379Signals__Storage__RootPathdefault/data/artifacts- Authority disabled by default for local; enable with
Signals__Authority__Enabled=trueand issuer settings.
CI workflow:
.gitea/workflows/signals-ci.ymlrestores, builds, tests, builds container, and uploadssignals-image.tarartifact.
Dependencies:
- Mongo 7 (wiredTiger)
- Redis 7 (cache)
- Artifact volume
signals_artifactsfor callgraph blobs.