From b92ef4c3692d36c9c1467d4410b7c8a9b39a7f7c Mon Sep 17 00:00:00 2001 From: Ken Hibino Date: Thu, 21 Oct 2021 07:11:46 -0700 Subject: [PATCH] Truncate payload printed in the UI Added a flag --max-payload-length to allow customizing the value --- cmd/asynqmon/main.go | 22 +++++++++++++++++++++- conversion_helpers.go | 5 ++++- handler.go | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/cmd/asynqmon/main.go b/cmd/asynqmon/main.go index cbe769a9..17197826 100644 --- a/cmd/asynqmon/main.go +++ b/cmd/asynqmon/main.go @@ -26,6 +26,7 @@ var ( flagRedisURL string flagRedisInsecureTLS bool flagRedisClusterNodes string + flagMaxPayloadLength int ) func init() { @@ -37,6 +38,7 @@ func init() { flag.StringVar(&flagRedisURL, "redis-url", "", "URL to redis server") flag.BoolVar(&flagRedisInsecureTLS, "redis-insecure-tls", false, "disable TLS certificate host checks") flag.StringVar(&flagRedisClusterNodes, "redis-cluster-nodes", "", "comma separated list of host:port addresses of cluster nodes") + flag.IntVar(&flagMaxPayloadLength, "max-payload-length", 200, "maximum number of utf8 characters printed in the payload cell in the Web UI") } // TODO: Write test and refactor this code. @@ -98,7 +100,8 @@ func main() { } h := asynqmon.New(asynqmon.Options{ - RedisConnOpt: redisConnOpt, + RedisConnOpt: redisConnOpt, + PayloadFormatter: asynqmon.PayloadFormatterFunc(formatPayload), }) defer h.Close() @@ -116,3 +119,20 @@ func main() { fmt.Printf("Asynq Monitoring WebUI server is listening on port %d\n", flagPort) log.Fatal(srv.ListenAndServe()) } + +func formatPayload(taskType string, payload []byte) string { + payloadStr := asynqmon.DefaultPayloadFormatter.FormatPayload(taskType, payload) + return truncate(payloadStr, flagMaxPayloadLength) +} + +// truncates string s to limit length (in utf8). +func truncate(s string, limit int) string { + i := 0 + for pos := range s { + if i == limit { + return s[:pos] + "…" + } + i++ + } + return s +} diff --git a/conversion_helpers.go b/conversion_helpers.go index a5883d23..c1063307 100644 --- a/conversion_helpers.go +++ b/conversion_helpers.go @@ -27,7 +27,10 @@ func (f PayloadFormatterFunc) FormatPayload(taskType string, payload []byte) str return f(taskType, payload) } -var defaultPayloadFormatter = PayloadFormatterFunc(func(_ string, payload []byte) string { +// DefaultPayloadFormatter is the PayloadFormater used by default. +// It prints the given payload bytes as is if the bytes are printable, otherwise it prints a message to indicate +// that the bytes are not printable. +var DefaultPayloadFormatter = PayloadFormatterFunc(func(_ string, payload []byte) string { if !isPrintable(payload) { return "non-printable bytes" } diff --git a/handler.go b/handler.go index a4b56f94..4a440e8b 100644 --- a/handler.go +++ b/handler.go @@ -88,7 +88,7 @@ var staticContents embed.FS func muxRouter(opts Options, rc redis.UniversalClient, inspector *asynq.Inspector) *mux.Router { router := mux.NewRouter().PathPrefix(opts.RootPath).Subrouter() - var pf PayloadFormatter = defaultPayloadFormatter + var pf PayloadFormatter = DefaultPayloadFormatter if opts.PayloadFormatter != nil { pf = opts.PayloadFormatter }