Gossipper is a Go rewrite of SIPp focused on SIP signaling load generation,
incremental XML scenario compatibility, and a cleaner engine architecture.
The current MVP implements:
- XML scenarios with
send,recv,pause,nop,label,timewait, andinit - XML command handoff via
sendCmd/recvCmd, both inside oneGossipperprocess and across multiple instances - SIPp-style 3PCC CLI aliases
-master,-slave, and-slave_cfgon top of the external command transport - Out-of-call SIP scenarios such as stateless
OPTIONSping/pong - Command-only 3PCC/out-of-call flows can run without a SIP remote address
- Expanded XML actions:
ereg,assign,assignstr,todouble,add,subtract,multiply,divide,strcmp,test,log,warning,lookup,jump,gettimeofday,urlencode,urldecode,verifyauth,setdest, andexec - Basic SIPp-style keywords such as
[call_id],[cseq],[branch],[remote_ip],[local_ip],[server_ip],[len],[last_*],[last_Request_URI],[users],[userid],[$var],[file ...],[fieldN ...], and Digest[authentication] - UDP transports
u1,un, andui(pragmatic client+server multi-IP mode) - Server-side UDP aliases
s1andsnfor UAS-style scenarios (they map tou1/un; they do not enable TLS) - Server-side TLS alias
slfor UAS (maps tol1; requires-tls_certand-tls_key) - Client-side TLS aliases
clandclnfor UAC (map tol1andln) - TCP transports
t1andtn - TLS transports
l1andln(UAC or UAS; same codes as for TCP, plus TLS files as needed) - Global and per-user variable scopes
- SIPp-style auth credentials via
-au/-apfor challenged401/407request retries, inline[authentication username=... password=...], and server-sideverifyauth - Optional SIP identity for built-in UAC /
invite_media:-sip_from(From before;tag=),-sip_pai,-sip_provider, repeatable-sip_extra_header(seedocs/compatibility.md[trunk_*]keywords) - Concurrent call generation with rate limiting
- Interactive terminal UI via
gossipper tui/gossipper -interactivefor launch presets and live runtime control - Basic statistics and JSON summary export (
-summary_json), optional standalone HTML report (-summary_htmlorgossipper report-html -in … -out …; seedocs/summary-json.md) - Named per-step RTD timers via
start_rtd/rtd, aggregated into summary JSON - XML
counter/displayattributes aggregated into summary JSON as execution counts - Exported stats now include failure-class counters such as
timeout,unexpected_sip,transport_error,parse_error,scenario_error, andcancelled - Summary JSON now includes latency repartition data and standard deviation for call length, invite RTT, and named RTD timers
- Full message tracing via
-trace_msg/-message_file, compact CSV tracing via-trace_shortmsg, per-scenario SIP command counters via-trace_counts, periodic CSV stats snapshots with cumulative and interval delta fields via-trace_stat+-fd, RTD CSV dumps via-trace_rtt+-rtt_freq, non-interactive runtime screen snapshots via-trace_screen/-screen_file, error tracing via-trace_err, compact unexpected-response code tracing via-trace_error_codes, and action log tracing via-trace_logs - SIP mirroring to Homer over HEP3 via
-hep_addr,-hep_capture_id, and optional-hep_password - Summary output now includes aggregated RTP/RTCP counters
- RTP streaming over
pion/rtp, includingexec rtp_streamwith SIPp-style params andstart/pause/resume/stop - Audio PCAP replay via
exec play_pcap_audio="capture.pcap"with preserved inter-packet timing and SDP-driven remote endpoint discovery - RFC 2833 DTMF generation via
exec send_dtmf="123"(digits: 0-9, *, #, A-D) and[dtmf_digits]keyword for variable-driven strings - Pragmatic video/image PCAP replay via
exec play_pcap_video="capture.pcap"andexec play_pcap_image="capture.pcap"using SDP media endpoint discovery (m=video/m=image) - Pragmatic RTP activity checks via
exec rtpcheck="..."with configurablemin_packets,timeout_ms, anddirection=any|send|recv|both(legacybidirectionalalias is also supported) - RTP echo helper mode via
exec rtp_stream="echo" - Periodic RTCP sender reports plus basic incoming RTCP counters via
pion/rtcp - Optional HTTP API (
-api_addr, optional-api_token) for/api/v1/stats, scenario XML (GET/PUTwith-sf),POST /api/v1/scenario/apply, andGET/POST /api/v1/control(rate / pause)
cmd/gossip: CLI entry pointhepcodec: public HEP3 wire encode/decode (SIP + media payloads)mediasink: publicMediaExporterAPI; built-in raw RTCP and Homer-Lake paths; optional compile-time extension for short JSON reportsinternal/cli: argument parsinginternal/scenario: XML parser and built-in scenariosinternal/template: SIPp keyword renderinginternal/sip: SIP message parsing helpersinternal/transport: UDP, TCP, and TLS transportsinternal/api: optional HTTP management API (-api_addr) for live stats, scenario file read/write, hot apply, and rate/pause controlinternal/scheduler: timing abstractioninternal/stats: counters and summariesinternal/media: RTP helpers backed by Piondocs: compatibility matrix, media roadmap, testing strategy
docs/gossipper-vs-sipp.md: high-level overview of whatGossippercan do and how it compares to SIPpdocs/compatibility.md: current XML, keyword, action, transport, and CLI compatibility matrix (including TLS socket modes vs SIPp / issue #7)docs/architecture.md: package-level architecture and execution modeldocs/media-roadmap.md: media-related scope, next steps, and deferred itemsdocs/compatibility-testing.md: testing approach for compatibility work and regression coveragedocs/statistics-mapping.md: mapping between currentGossipperstats exports and SIPp-style countersdocs/trace-schema-contract.md: stable CSV header/order contract for-trace_stat,-trace_rtt, and-trace_screendocs/tui.md: interactive TUI usage guide with launcher and runtime screen examplesdocs/interactive-shell.md: line shell (gossipper shell/cli) withset,wizard,hint, andrundocs/run-profile.md: JSON run profiles (-config,-run-alias,-list-aliases); bundledtestdata/run-profiles/*.jsonincluding HEP script presetsdocs/licensing.md: license choice and SPDX header guidance for future source filesmilestone.md: prioritized roadmap for SIPp features that are still missing inGossipper
Run the built-in UAC scenario against a SIP endpoint:
go run ./cmd/gossip -sn uac -rsa 127.0.0.1:5060 -m 1 -r 1Run SIPp-style rate period scheduling (-r n -rp m):
go run ./cmd/gossip -sn uac -rsa 127.0.0.1:5060 -r 7 -rp 2000 -m 50Run with periodic CPS ramping:
go run ./cmd/gossip -sn uac -rsa 127.0.0.1:5060 -r 10 -rate_increase 2 -rate_interval 1000 -rate_max 50 -m 1000Run with a deterministic global timeout (CI-friendly):
go run ./cmd/gossip -sn uac -rsa 127.0.0.1:5060 -m 10000 -r 50 -timeout_global 30Benchmark gossipper vs SIPp (requires UAS or -start-uas):
./scripts/benchmark-sipp-vs-gossipper.sh -start-uas -calls 500 -rate 50
make benchmark # same, via MakefileGenerate CSV lookup index for faster lookup action resolution:
go run ./cmd/gossip -infindex ./testdata/injection/inject.csv 0Run M3 ui transport MVP (source IP selected per call from CSV):
go run ./cmd/gossip -sn uac -rsa 127.0.0.1:5060 -t ui -inf ./testdata/injection/ui_ips.csv -ip_field 0 -m 20 -r 10Print build version information:
go run ./cmd/gossip -versionEnable pprof HTTP server for live CPU/memory/goroutine profiling:
go run ./cmd/gossip -sn uac -rsa 127.0.0.1:5060 -m 1000 -r 50 -pprof :6060
# In another terminal: go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile?seconds=30Write CPU and memory profiles to files at exit:
go run ./cmd/gossip -sn uac -rsa 127.0.0.1:5060 -m 500 -r 20 -cpuprofile cpu.prof -memprofile mem.prof
go tool pprof -http=:8080 cpu.prof # or mem.prof for heapLaunch the interactive TUI:
go run ./cmd/gossip tuior:
go run ./cmd/gossip -interactiveRun a custom XML scenario:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -m 10 -r 5Write a JSON summary:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -summary_json summary.jsonWrite full and short message traces:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_msg -trace_shortmsg -message_file ./messages.logWrite unexpected responses and action logs to dedicated files:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_err -trace_error_codes -error_file ./errors.log -trace_logs -log_file ./actions.logWrite periodic CSV stats snapshots:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_stat -fd 2 -message_file ./messages.logWrite periodic per-command SIP message counters:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_counts -fd 2 -message_file ./messages.logWrite periodic non-interactive runtime screen snapshots:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_screen -fd 2 -screen_file ./screen.logInteractive controls during a TUI run:
+/-: increase or decrease target CPS*//: increase or decrease target CPS by 10x step (-rate_scalebased)p: pause or resume new call schedulingq: stop the run like SIPp by draining active calls in client modeEsc: return to the launch screen after the run finishes
Write RTD CSV samples:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_rtt -rtt_freq 50 -message_file ./messages.logMirror SIP messages to Homer over HEP3:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -hep_addr 127.0.0.1:9060 -hep_capture_id 2001 -hep_password secretGossipper ships with a non-blocking structured event logger that fans the SIP dialog (and other engine events) out to one or more sinks: stdout, JSON-Lines file, and OpenTelemetry collectors over OTLP/gRPC or OTLP/HTTP. All sinks are fed by a single ring buffer, so emitting events never blocks the SIP hot path — on overflow the oldest events are dropped and counted.
Resource attributes are attached at the OTel LoggerProvider level. By default
Gossipper injects service.name=gossipper, service.version=<build>, and
gossipper.role=client|server. Any extra -log_attr key=value pair (repeatable)
is also added — typical use is self_tag / peer_tag to label nodes such as
NYC01 / NYC02.
Client NYC02 shipping logs to a collector via OTLP/gRPC:
go run ./cmd/gossip -sn uac -rsa 10.0.0.3:5060 \
-log_otel_endpoint otel-collector:4317 -log_otel_proto grpc -log_otel_insecure \
-log_attr self_tag=NYC02 -log_attr peer_tag=NYC01 -log_stdoutServer NYC01 shipping logs over OTLP/HTTP (typical when the collector sits
behind a TLS-terminating proxy):
go run ./cmd/gossip -sn uas -t s1 -i 0.0.0.0 -p 5060 \
-log_otel_endpoint http://otel-collector:4318 -log_otel_proto http \
-log_attr self_tag=NYC01 -log_attr peer_tag=NYC02 \
-log_file_jsonl /tmp/gossipper-events.jsonlThe full set of flags is described in docs/event-logging.md, including event
schema, the list of Kind values, ring-buffer sizing guidance, and tips for
high-CPS deployments. The legacy -trace_* files keep working in parallel and
are unaffected by event logging.
Run over TLS (UAC; -t cl is the same as -t l1 after startup):
go run ./cmd/gossip -t cl -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5061 -tls_skip_verifySame with explicit l1:
go run ./cmd/gossip -t l1 -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5061 -tls_skip_verifySIP TLS (answers to common support questions): signaling over TLS is supported. For UAC use -t l1 or -t ln, or the aliases -t cl / -t cln (same as l1 / ln). For a UAS, -t s1 / -t sn are UDP-only aliases; use -t l1 / -t ln or the TLS server shortcut -t sl (same as l1). A TLS listener needs -tls_cert and -tls_key; clients often use -tls_ca and -tls_skip_verify=false when validating the peer. The default -tls_skip_verify=true is convenient for lab setups only.
Run the built-in UAS over TLS (replace certificate paths with real files):
go run ./cmd/gossip -sn uas -t sl -i 0.0.0.0 -p 5061 \
-tls_cert ./server.crt -tls_key ./server.key -m 1Run the built-in UAS in SIPp-style server transport mode:
go run ./cmd/gossip -sn uas -t s1 -i 0.0.0.0 -p 5060 -m 1Run out-of-call OPTIONS ping/pong between two Gossipper instances:
go run ./cmd/gossip -sf ./testdata/scenarios/options_server.xml -t s1 -i 0.0.0.0 -p 5060 -m 1
go run ./cmd/gossip -sf ./testdata/scenarios/options_client.xml -rsa 127.0.0.1:5060 -s options -m 1 -r 1Run a challenged Digest auth scenario with SIPp-style credentials:
go run ./cmd/gossip -sf ./testdata/scenarios/auth_uac.xml -rsa 127.0.0.1:5060 -s alice -au alice -ap secret -m 1 -r 1Run with an explicit base CSeq for [cseq] tokens:
go run ./cmd/gossip -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -base_cseq 42 -m 1 -r 1Run a SIPp-style audio PCAP replay action from a scenario:
go run ./cmd/gossip -sf ./testdata/scenarios/uac_pcap.xml -rsa 127.0.0.1:5060 -m 1 -r 1Run the bundled local two-sided PCAP demo between two Gossipper instances:
go run ./cmd/gossip -sf ./testdata/scenarios/uas_pcap.xml -t s1 -i 0.0.0.0 -p 5060 -s pcap -m 1
go run ./cmd/gossip -sf ./testdata/scenarios/uac_pcap.xml -rsa 127.0.0.1:5060 -s pcap -m 1 -r 1Run the bundled DTMF-over-PCAP demo against the same local UAS:
go run ./cmd/gossip -sf ./testdata/scenarios/uas_pcap.xml -t s1 -i 0.0.0.0 -p 5060 -s pcap -m 1
go run ./cmd/gossip -sf ./testdata/scenarios/uac_dtmf_pcap.xml -rsa 127.0.0.1:5060 -s pcap -m 1 -r 1Run 3PCC-style command exchange between instances with the low-level transport flags:
go run ./cmd/gossip -sf ./scenario.xml -rsa 127.0.0.1:5060 -cmd_name m -cmd_peers ./peers.cfgRun the same flow with SIPp-style master/slave aliases:
go run ./cmd/gossip -sf ./testdata/scenarios/3pcc_slave.xml -slave s1 -slave_cfg ./peers.cfg
go run ./cmd/gossip -sf ./testdata/scenarios/3pcc_master.xml -master m -slave_cfg ./peers.cfg -rsa 127.0.0.1:5060Build the release binary:
make buildBuild Linux packages with nfpm:
make package-deb
make package-rpmOr call the builder script directly:
VERSION=0.1.0 ARCH=amd64 scripts/build-package.sh deb
VERSION=0.1.0 ARCH=amd64 scripts/build-package.sh rpmThe builder uses local nfpm when available and falls back to the
goreleaser/nfpm Docker image otherwise.
By default, package versions are taken from cmd/gossip/version.go. You can
override them by exporting VERSION=... for ad-hoc builds.
Package artifacts are written to dist/ and install the gossipper binary
at /usr/bin/gossipper.
- This is a behavior-oriented rewrite, not a literal source port of SIPp.
- For a narrative overview of current capabilities and trade-offs versus SIPp, see
docs/gossipper-vs-sipp.md. - XML compatibility is intentionally incremental. See
docs/compatibility.md. - For stats/export mapping against SIPp terminology, see
docs/statistics-mapping.md. - External
sendCmd/recvCmduses a simple TCP peer map inname;host:portformat via either-cmd_name/-cmd_peersor the SIPp-like aliases-master/-slave/-slave_cfg. - If a scenario only uses
sendCmd/recvCmdplus control commands, it can run without-rsa. - Regular out-of-call SIP request/response scenarios are supported too, for example
OPTIONShealthcheck flows without dialog teardown. -t s1and-t snare server-side UDP aliases and require a server scenario such as-sn uas.-message_fileenables full message trace output to a file;-trace_shortmsgwrites a sibling compact CSV log with per-message summaries.-trace_errwrites unexpected SIP responses and runtime failures to-error_file.-trace_error_codeswrites a sibling compact CSV file with unexpected SIP response codes and expected match criteria.-trace_logswrites XML<log>action output to-log_file.-trace_statwrites periodic and final CSV stats snapshots to a sibling*_stats.logfile; when-message_fileis set it uses that base path. The CSV includes cumulative totals, per-interval delta fields, and latency standard deviation columns.-fdcontrols the snapshot period in seconds.-trace_countswrites periodic CSV snapshots to a sibling*_counts.logfile with per-scenario SIP command counters (sent,recv,unexp) using the same-fdcadence.-trace_screenwrites periodic and final runtime summary snapshots to a sibling*_screen.logCSV file; fields include totals, CPS, interval CPS, success ratio, and key failure counters (failure_timeout,failure_unexpected_sip).-screen_filesets the explicit output path, and-fdcontrols snapshot cadence.- send
SIGUSR1to a running process to force an immediate-trace_screensnapshot dump without waiting for the next-fdtick. -timeout_globalstops the run after N seconds of total process runtime while still emitting final summaries/artifacts.-rate_scalesets the interactive target CPS step used by TUI keys (+/-for 1x and*//for 10x).- Exported stats also include failure-class counters so automation can distinguish timeouts, unexpected SIP, transport errors, parse errors, scenario errors, and cancellations.
-trace_rttwrites named RTD samples to a sibling*_rtt.logCSV file with timestamp, call, RTD name, and duration in milliseconds.-rtt_freqcontrols flush cadence in completed calls (default200).- Stable CSV header contracts for
-trace_stat,-trace_rtt, and-trace_screenare documented indocs/trace-schema-contract.md. - Summary JSON now exports repartition buckets for
call_length,invite_rtt, and namedrtdtimers so automation can consume latency distributions without parsing raw RTT dumps. -hep_addrmirrors SIPsend/recvtraffic to a Homer-compatible HEP3 collector over UDP.-hep_capture_idsets the HEP capture node ID;-hep_passwordsets the optional HEP auth key.- The current HEP MVP exports SIP signaling only; RTP/RTCP mirroring is not included yet.
[authentication]currently covers Digest401/407challenge responses withMD5andqop=auth; the scenario must explicitly place[authentication]into the retried request.-base_cseqsets the seed value used by[cseq]token rendering.-rpsets the SIPp-compatible rate period in milliseconds for-r(ncalls everyrpms).-rate_increaseadjusts target CPS every-rate_intervalmilliseconds during run;-rate_maxsets an optional upper cap.-max_socketlimits simultaneously open call sockets for per-call client transports (un,tn,ln, aliascln).-max_reconnectand-reconnect_sleepenable reconnect retries for shared client TCP/TLS transports (t1,l1, or thecl/slaliases that normalize tol1) on transport failures.-reconnect_closein shared clientt1/l1(orcl/sl) closes active calls on socket loss by skipping reconnect attempts.-infindex <file> <field>generates an index file next to the CSV (.gossipper.idx.<field>.json) so lookup-by-key can avoid full-file scans.-t uicurrently provides an M3 client+server MVP: one shared UDP socket per configured IP (client: per-call source IP rotation, server: one listener per configured IP).-inf <file>+-ip_field <idx>are required with-t uiand select UI bind IPs from the CSV field (zero-based index).- In
-t uiclient mode,-infrow order is preserved and duplicate IP rows intentionally affect round-robin weighting; in server mode listeners are created per unique IP. - XML action
setdestis supported in the pragmatic M3 scope for UDP shared-socket flows (u1,ui, and server-side UDP aliases) and enforces protocol compatibility checks. - TUI launch form supports
-t uiwith explicitinf/ip_fieldinputs and validates them before run start. start_rtdandrtdnow record named per-step timings into the summary model; they are especially useful for XML flows likesend INVITE->recv 200.counteranddisplayare currently exposed as successful-command execution counters in the summary model, which is a practical first step toward richer SIPp-style reporting.- In external 3PCC-style flows, the first incoming
recvCmdcan automatically adopt itsCall-IDinto[call_id]for later commands. initcan also usesendCmd/recvCmd, so inter-instance setup data may be loaded into global scopes before SIP traffic starts.- When launched with
-slave,Gossippervalidates that the scenario first enters the flow viarecvCmdbefore it sends anysendCmd. - RTP support is a separate milestone layered on top of the SIP engine.
- Current RTP support focuses on audio streaming from PCM mono 8kHz WAV input, audio PCAP replay, RTP echo, and basic RTCP observability.
play_pcap_audiocurrently replays UDP payloads from the capture as RTP toward the negotiated audio endpoint; pragmaticplay_pcap_video/play_pcap_imagesupport reuses the same replay mechanism for SDPm=video/m=imageendpoints.rtpcheckcurrently provides pragmatic RTP activity validation (min_packets,timeout_ms,direction; legacybidirectionalalias) and is not full SIPp SRTP/quality parity.
When a new tag of the form vX.Y.Z is pushed, the .github/workflows/version-sync.yml
workflow automatically updates the Version constant in cmd/gossip/version.go on the
main branch to match the tag (stripping the leading v). The release build workflow
(.github/workflows/release.yml) then picks up the new tag and publishes the release
assets.
To cut a release:
git tag v1.2.3
git push origin v1.2.3The version sync workflow commits the updated version.go back to main automatically.
AGPL-3.0. See LICENSE.