Skip to content
Snippets Groups Projects
Commit 5c706f7d authored by ale's avatar ale
Browse files

Add instrumentation

parent df8a3cd4
No related branches found
No related tags found
No related merge requests found
...@@ -2,7 +2,9 @@ package reportscollector ...@@ -2,7 +2,9 @@ package reportscollector
import ( import (
"encoding/json" "encoding/json"
"net"
"net/http" "net/http"
"net/url"
"time" "time"
) )
...@@ -41,7 +43,18 @@ func (h *ReportHandler) eventFromReport(report *report) Event { ...@@ -41,7 +43,18 @@ func (h *ReportHandler) eventFromReport(report *report) Event {
e.Set("type", report.Type) e.Set("type", report.Type)
e.Set("event_timestamp", ts) e.Set("event_timestamp", ts)
e.Set("url", report.URL) e.Set("url", report.URL)
e.Set("domain", domainFromURL(report.URL))
e.Set("user_agent", report.UserAgent) e.Set("user_agent", report.UserAgent)
e.Set("body", report.Body) e.Set("body", report.Body)
return e return e
} }
func domainFromURL(u string) string {
if uri, err := url.Parse(u); err == nil {
if host, _, err := net.SplitHostPort(uri.Host); err == nil {
return host
}
return uri.Host
}
return ""
}
package main package main
import ( import (
"context"
"flag" "flag"
"log" "log"
"net/http" "net/http"
"os" "os"
"os/signal"
"syscall"
"time" "time"
rc "git.autistici.org/ai3/tools/reports-collector" rc "git.autistici.org/ai3/tools/reports-collector"
"github.com/prometheus/client_golang/prometheus/promhttp"
) )
var ( var (
addr = flag.String("addr", fromEnv("ADDR", ":4890"), "address to listen on") addr = flag.String("addr", fromEnv("ADDR", ":4890"), "address to listen on")
gracefulShutdownTimeout = 5 * time.Second
) )
func fromEnv(name, deflt string) string { func fromEnv(name, deflt string) string {
...@@ -34,6 +40,7 @@ func main() { ...@@ -34,6 +40,7 @@ func main() {
// Create the http.Server. // Create the http.Server.
mux := http.NewServeMux() mux := http.NewServeMux()
mux.Handle("/ingest/v1", collector) mux.Handle("/ingest/v1", collector)
mux.Handle("/metrics", promhttp.Handler())
server := &http.Server{ server := &http.Server{
Addr: *addr, Addr: *addr,
Handler: mux, Handler: mux,
...@@ -42,8 +49,30 @@ func main() { ...@@ -42,8 +49,30 @@ func main() {
WriteTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second,
} }
done := make(chan struct{})
sigCh := make(chan os.Signal, 1)
go func() {
<-sigCh
log.Printf("terminating")
// Gracefully terminate, then shut down remaining
// clients.
ctx, cancel := context.WithTimeout(
context.Background(), gracefulShutdownTimeout)
defer cancel()
if err := server.Shutdown(ctx); err == context.Canceled {
if err := server.Close(); err != nil {
log.Printf("error terminating server: %v", err)
}
}
close(done)
}()
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
err := server.ListenAndServe() err := server.ListenAndServe()
if err != nil { if err != nil && err != http.ErrServerClosed {
log.Fatalf("error: %v", err) log.Fatalf("server error: %v", err)
} }
<-done
} }
...@@ -6,6 +6,8 @@ import ( ...@@ -6,6 +6,8 @@ import (
"log" "log"
"mime" "mime"
"net/http" "net/http"
"github.com/prometheus/client_golang/prometheus"
) )
var ErrNoMatch = errors.New("no match") var ErrNoMatch = errors.New("no match")
...@@ -69,5 +71,17 @@ hloop: ...@@ -69,5 +71,17 @@ hloop:
for _, e := range events { for _, e := range events {
e.Set("ip", ip) e.Set("ip", ip)
c.sink.Send(e) c.sink.Send(e)
reportsByType.WithLabelValues(
e.GetString("type"), e.GetString("domain")).Inc()
} }
} }
var (
reportsByType = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "reports_total",
Help: "Number of reports by type.",
},
[]string{"type", "domain"},
)
)
...@@ -5,3 +5,7 @@ type Event map[string]interface{} ...@@ -5,3 +5,7 @@ type Event map[string]interface{}
func (e Event) Set(key string, value interface{}) { func (e Event) Set(key string, value interface{}) {
e[key] = value e[key] = value
} }
func (e Event) GetString(key string) string {
return e[key].(string)
}
module git.autistici.org/ai3/tools/reports-collector module git.autistici.org/ai3/tools/reports-collector
require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/prometheus/client_golang v1.8.0
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
)
go.sum 0 → 100644
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment