Files
smallwebwaf/docs/metrics.md
T
sneak 68da92f414
check / check (push) Failing after 3m27s
Read every setting through viper and rename the settings (closes #211)
Every setting of discriminator and rproxy is read through viper, in place
of the os.LookupEnv function Main passed down. NewViper turns AutomaticEnv
and AllowEmptyEnv on, so a setting that is set but empty reads as set. A
setting may also be given as a file, the _FILE form, which rproxy's
settings now have too; rproxy still writes nothing to disk.

The settings are renamed. Discriminator's take the prefix SWW_WAF_,
rproxy's take SWW_RPROXY_, and the shared SWW_COMMAND keeps SWW_. The Core
Rule Set's settings take SWW_WAF_CORE_RULE_SET_ rather than SWW_WAF_WAF_.
Every place a name appeared changed: the code, the viper keys, tests,
documents, examples, the README's settings table and the image files.

Model: deepseek-v4-pro
2026-11-07 06:41:11 +00:00

85 lines
3.0 KiB
Markdown

# The metrics
What `GET /_sww/metrics` answers with, at `discriminator`'s own address.
"Metrics endpoint" in [`SPEC.md`](../SPEC.md) describes the endpoint. Prometheus
keeps the `instance` label as `exported_instance` unless the scrape sets
`honor_labels: true`. `rproxy` has no metrics.
## Traffic
- `sww_requests_total`, `sww_request_bytes_total` and
`sww_response_bytes_total`, by `status_class` such as `2xx` and by `action`;
- `sww_request_duration_seconds` and `sww_upstream_duration_seconds`, as
histograms;
- `sww_requests_in_flight`: the questions and requests to its own endpoints that
`discriminator` is handling.
## Limits and bans
- `sww_rate_limit_hits_total`, by `window` and by `kind` (`requests`, `bytes` or
`refusals`);
- `sww_offences_total`, by `kind`;
- `sww_bans_made_total`, by `cause`;
- `sww_active_bans` and `sww_permanent_bans`.
## Attack detection
- `sww_rule_matches_total`, by `rule_id` and `action`, and `sww_rules_loaded`;
- `sww_waf_matches_total`, by `mode` and `rule_id`, for the rules that fired.
## Countries and AS numbers
For the `SWW_WAF_METRICS_TOP_N` busiest of each, the rest as `other`:
- `sww_country_requests_total`, `sww_country_request_bytes_total`,
`sww_country_response_bytes_total` and `sww_country_list_refusals_total`, by
`country`;
- `sww_asn_requests_total`, `sww_asn_request_bytes_total` and
`sww_asn_response_bytes_total`, by `asn`.
## Lookups
- `sww_geojs_requests_total` and `sww_geojs_failures_total`;
- `sww_geojs_unanswered_total`: the requests that needed an answer and went on
without it;
- with the file source, `sww_lookup_database_last_read_timestamp_seconds` and
`sww_lookup_database_read_failures_total`.
## Reputation sources
By `source`: each list's URL, each zone, and `abuseipdb`:
- `sww_reputation_hits_total`, `sww_reputation_queries_total` and
`sww_reputation_failures_total`;
- `sww_reputation_last_fetch_timestamp_seconds`, for a list;
- `sww_reputation_daily_budget_remaining`, for AbuseIPDB.
## State files
By `file`:
- `sww_state_file_writes_total`, `sww_state_file_write_failures_total`,
`sww_state_file_last_write_timestamp_seconds` and `sww_state_file_size_bytes`;
- `sww_state_file_edits_taken_in_total` and
`sww_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_total` and `sww_remote_log_buffer_depth`;
- by `destination`, `sww_alerts_sent_total`, `sww_alerts_failed_total`,
`sww_alerts_suppressed_total` and `sww_alerts_dropped_total`;
- Go's own `go_` metrics and the process's `process_` metrics.
## When a request is counted
`discriminator` 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.