Add ASN to logtail, collector, aggregator, frontend and CLI
This commit is contained in:
@@ -54,6 +54,7 @@ type filterState struct {
|
||||
WebsiteRe string // RE2 regex against website
|
||||
URIRe string // RE2 regex against request URI
|
||||
IsTor string // "", "1" (TOR only), "0" (non-TOR only)
|
||||
ASN string // expression: "12345", "!=65000", ">=1000", etc.
|
||||
}
|
||||
|
||||
// QueryParams holds all parsed URL parameters for one page request.
|
||||
@@ -91,7 +92,7 @@ var windowSpecs = []struct{ s, label string }{
|
||||
}
|
||||
|
||||
var groupBySpecs = []struct{ s, label string }{
|
||||
{"website", "website"}, {"prefix", "prefix"}, {"uri", "uri"}, {"status", "status"},
|
||||
{"website", "website"}, {"asn", "asn"}, {"prefix", "prefix"}, {"status", "status"}, {"uri", "uri"},
|
||||
}
|
||||
|
||||
func parseWindowString(s string) (pb.Window, string) {
|
||||
@@ -121,6 +122,8 @@ func parseGroupByString(s string) (pb.GroupBy, string) {
|
||||
return pb.GroupBy_REQUEST_URI, "uri"
|
||||
case "status":
|
||||
return pb.GroupBy_HTTP_RESPONSE, "status"
|
||||
case "asn":
|
||||
return pb.GroupBy_ASN_NUMBER, "asn"
|
||||
default:
|
||||
return pb.GroupBy_WEBSITE, "website"
|
||||
}
|
||||
@@ -159,12 +162,13 @@ func (h *Handler) parseParams(r *http.Request) QueryParams {
|
||||
WebsiteRe: q.Get("f_website_re"),
|
||||
URIRe: q.Get("f_uri_re"),
|
||||
IsTor: q.Get("f_is_tor"),
|
||||
ASN: q.Get("f_asn"),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func buildFilter(f filterState) *pb.Filter {
|
||||
if f.Website == "" && f.Prefix == "" && f.URI == "" && f.Status == "" && f.WebsiteRe == "" && f.URIRe == "" && f.IsTor == "" {
|
||||
if f.Website == "" && f.Prefix == "" && f.URI == "" && f.Status == "" && f.WebsiteRe == "" && f.URIRe == "" && f.IsTor == "" && f.ASN == "" {
|
||||
return nil
|
||||
}
|
||||
out := &pb.Filter{}
|
||||
@@ -195,6 +199,12 @@ func buildFilter(f filterState) *pb.Filter {
|
||||
case "0":
|
||||
out.Tor = pb.TorFilter_TOR_NO
|
||||
}
|
||||
if f.ASN != "" {
|
||||
if n, op, ok := st.ParseStatusExpr(f.ASN); ok {
|
||||
out.AsnNumber = &n
|
||||
out.AsnOp = op
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
@@ -226,6 +236,9 @@ func (p QueryParams) toValues() url.Values {
|
||||
if p.Filter.IsTor != "" {
|
||||
v.Set("f_is_tor", p.Filter.IsTor)
|
||||
}
|
||||
if p.Filter.ASN != "" {
|
||||
v.Set("f_asn", p.Filter.ASN)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
@@ -247,7 +260,7 @@ func (p QueryParams) buildURL(overrides map[string]string) string {
|
||||
func (p QueryParams) clearFilterURL() string {
|
||||
return p.buildURL(map[string]string{
|
||||
"f_website": "", "f_prefix": "", "f_uri": "", "f_status": "",
|
||||
"f_website_re": "", "f_uri_re": "",
|
||||
"f_website_re": "", "f_uri_re": "", "f_is_tor": "", "f_asn": "",
|
||||
})
|
||||
}
|
||||
|
||||
@@ -260,7 +273,9 @@ func nextGroupBy(s string) string {
|
||||
return "uri"
|
||||
case "uri":
|
||||
return "status"
|
||||
default: // status → back to website
|
||||
case "status":
|
||||
return "asn"
|
||||
default: // asn → back to website
|
||||
return "website"
|
||||
}
|
||||
}
|
||||
@@ -276,6 +291,8 @@ func groupByFilterKey(s string) string {
|
||||
return "f_uri"
|
||||
case "status":
|
||||
return "f_status"
|
||||
case "asn":
|
||||
return "f_asn"
|
||||
default:
|
||||
return "f_website"
|
||||
}
|
||||
@@ -338,6 +355,12 @@ func buildCrumbs(p QueryParams) []Crumb {
|
||||
RemoveURL: p.buildURL(map[string]string{"f_is_tor": ""}),
|
||||
})
|
||||
}
|
||||
if p.Filter.ASN != "" {
|
||||
crumbs = append(crumbs, Crumb{
|
||||
Text: asnTermStr(p.Filter.ASN),
|
||||
RemoveURL: p.buildURL(map[string]string{"f_asn": ""}),
|
||||
})
|
||||
}
|
||||
return crumbs
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user