Add Honeybadger.io observability support.

It's not yet clear how useful it is, but it's at least something.
This commit is contained in:
Catherine
2025-09-20 14:12:55 +00:00
parent e5f1bac0ed
commit 960a40d736
6 changed files with 88 additions and 6 deletions

View File

@@ -6,6 +6,15 @@ import (
)
func ServeHealth(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "ok")
switch r.URL.Path {
case "/":
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "ok")
case "/panic":
panic("explicit panic request")
default:
http.Error(w, "not found", http.StatusNotFound)
}
}

View File

@@ -2,11 +2,13 @@ package main
import (
"flag"
"fmt"
"log"
"log/slog"
"net"
"net/http"
"os"
"runtime/debug"
"strings"
"github.com/KimMachineGun/automemlimit/memlimit"
@@ -32,17 +34,37 @@ func listen(name string, listen string) net.Listener {
return listener
}
func panicHandler(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
log.Printf("panic: %s %s %s: %s\n%s",
r.Method, r.Host, r.URL.Path, err, string(debug.Stack()))
http.Error(w,
fmt.Sprintf("internal server error: %s", err),
http.StatusInternalServerError,
)
}
}()
handler.ServeHTTP(w, r)
})
}
func serve(listener net.Listener, serve func(http.ResponseWriter, *http.Request)) {
if listener != nil {
if err := http.Serve(listener, http.HandlerFunc(serve)); err != nil {
log.Fatalln(err)
}
var handler http.Handler
handler = http.HandlerFunc(serve)
handler = ObserveHTTPHandler(handler)
handler = panicHandler(handler)
log.Fatalln(http.Serve(listener, handler))
}
}
func main() {
var err error
InitObservability()
configPath := flag.String("config", "config.toml", "path to configuration file")
migrateV1Path := flag.String("migrate-v1", "", "path to v1 data directory to upload")
flag.Parse()

27
src/observe.go Normal file
View File

@@ -0,0 +1,27 @@
package main
import (
"net/http"
"os"
"runtime/debug"
"github.com/honeybadger-io/honeybadger-go"
)
func hasHoneybadger() bool {
return os.Getenv("HONEYBADGER_API_KEY") != ""
}
func InitObservability() {
if hasHoneybadger() {
honeybadger.Configure(honeybadger.Configuration{})
debug.SetPanicOnFault(true)
}
}
func ObserveHTTPHandler(handler http.Handler) http.Handler {
if hasHoneybadger() {
handler = honeybadger.Handler(handler)
}
return handler
}