The answers of GeoJS, the lists fetched by URL, the DNS blocklists, AbuseIPDB and routewatch each go in a cache file in SWW_CACHE_DIR (default /var/cache/sww): lookups.json, lists.json, dnsbl.json, abuseipdb-scores.json and routewatch.json. reputation.json is gone. The AbuseIPDB checks spent today are a count, not a cache, and stay in SWW_STATE_DIR as abuseipdb-checks-spent.json. A cache file never stops the start: one that does not parse is set aside as an edit is, one that cannot be read is written over, and its cache starts empty. An unwritable SWW_CACHE_DIR stops the start, as an unwritable SWW_STATE_DIR does. Each directory is watched on its own. The run script makes the cache directory and gives it to sww. Model: opus-5-5
3.2 KiB
The metrics
What GET /_sww/metrics answers with, at waf's own address. "Metrics
endpoint" in SPEC.md describes the endpoint. Prometheus keeps
the instance label as exported_instance unless the scrape sets
honor_labels: true. rproxy has no metrics.
Every sww_*request_bytes_total and sww_*response_bytes_total series counts
body bytes, never headers, whatever SWW_BYTES_COUNT says.
Traffic
sww_requests_total,sww_request_bytes_totalandsww_response_bytes_total, bystatus_classsuch as2xxand byaction;sww_request_duration_secondsandsww_upstream_duration_seconds, as histograms;sww_requests_in_flight: the questions and requests to its own endpoints thatwafis handling.
Limits and bans
sww_rate_limit_hits_total, bywindowand bykind(requests,bytesorrefusals);sww_offences_total, bykind;sww_bans_made_total, bycause;sww_active_bansandsww_permanent_bans.
Attack detection
sww_rule_matches_total, byrule_idandaction, andsww_rules_loaded;sww_core_rule_set_matches_total, bymodeandrule_id, for the rules that fired.
Countries and AS numbers
For the SWW_METRICS_TOP_N busiest of each, the rest as other:
sww_country_requests_total,sww_country_request_bytes_total,sww_country_response_bytes_totalandsww_country_list_refusals_total, bycountry;sww_asn_requests_total,sww_asn_request_bytes_totalandsww_asn_response_bytes_total, byasn.
Lookups
sww_geojs_requests_totalandsww_geojs_failures_total;sww_requests_without_geojs_answer_total: the requests that needed an answer and went on without it;- with the file source,
sww_lookup_database_last_read_timestamp_secondsandsww_lookup_database_read_failures_total.
Reputation sources
By source: each list's URL, each zone, and abuseipdb:
sww_reputation_hits_total,sww_reputation_queries_totalandsww_reputation_failures_total;sww_reputation_last_fetch_timestamp_seconds, for a list;sww_reputation_daily_budget_remaining, for AbuseIPDB.
State and cache files
By file, the name of a state or cache file:
sww_state_file_writes_total,sww_state_file_write_failures_total,sww_state_file_last_write_timestamp_secondsandsww_state_file_size_bytes;sww_state_file_edits_taken_in_totalandsww_state_file_edits_set_aside_total;sww_tracked_clients: the clients in the table.
Remote log, alerts and the process
- while a syslog server is set,
sww_remote_log_lines_sent_total,sww_remote_log_lines_dropped_totalandsww_remote_log_lines_waiting; - by
destination,sww_alerts_sent_total,sww_alert_send_failures_total,sww_alerts_suppressed_totalandsww_alerts_dropped_total; - Go's own
go_metrics and the process'sprocess_metrics.
When a request is counted
waf counts a denied request at its decision, and a request to its own
endpoints when it is answered. It counts an allowed request when its report
comes, with the status, bytes and times the report gives. These are not counted:
- a report itself;
- an allowed request whose report never comes;
- a question refused with
400; - a question whose body stopped arriving.