From a9dae90692c8757e85e814ad000a2e828a6368fa Mon Sep 17 00:00:00 2001 From: Yujie Xia Date: Fri, 15 Jan 2021 19:07:38 +0800 Subject: [PATCH] add metrics for tpcc workload (#69) Signed-off-by: Yujie Xia --- cmd/go-tpc/main.go | 2 + cmd/go-tpc/tpcc.go | 10 +++++ go.mod | 1 + go.sum | 12 ++++-- tpcc/metrics.go | 98 ++++++++++++++++++++++++++++++++++++++++++++++ tpcc/workload.go | 20 +++++++--- 6 files changed, 134 insertions(+), 9 deletions(-) create mode 100644 tpcc/metrics.go diff --git a/cmd/go-tpc/main.go b/cmd/go-tpc/main.go index feea326..ca2669a 100644 --- a/cmd/go-tpc/main.go +++ b/cmd/go-tpc/main.go @@ -33,6 +33,7 @@ var ( isolationLevel int silence bool pprofAddr string + metricsAddr string maxProcs int globalDB *sql.DB @@ -87,6 +88,7 @@ func main() { } rootCmd.PersistentFlags().IntVar(&maxProcs, "max-procs", 0, "runtime.GOMAXPROCS") rootCmd.PersistentFlags().StringVar(&pprofAddr, "pprof", "", "Address of pprof endpoint") + rootCmd.PersistentFlags().StringVar(&metricsAddr, "metrics-addr", "", "Address of metrics endpoint") rootCmd.PersistentFlags().StringVarP(&dbName, "db", "D", "test", "Database name") rootCmd.PersistentFlags().StringVarP(&host, "host", "H", "127.0.0.1", "Database host") rootCmd.PersistentFlags().StringVarP(&user, "user", "U", "root", "Database user") diff --git a/cmd/go-tpc/tpcc.go b/cmd/go-tpc/tpcc.go index 7589bda..5f6a699 100644 --- a/cmd/go-tpc/tpcc.go +++ b/cmd/go-tpc/tpcc.go @@ -11,6 +11,7 @@ import ( "github.com/pingcap/go-tpc/pkg/measurement" "github.com/pingcap/go-tpc/pkg/workload" "github.com/pingcap/go-tpc/tpcc" + "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/spf13/cobra" ) @@ -22,6 +23,15 @@ func executeTpcc(action string) { http.ListenAndServe(pprofAddr, http.DefaultServeMux) }() } + if metricsAddr != "" { + go func() { + s := http.Server{ + Addr: metricsAddr, + Handler: promhttp.Handler(), + } + s.ListenAndServe() + }() + } runtime.GOMAXPROCS(maxProcs) openDB() diff --git a/go.mod b/go.mod index 5ce8976..193a76d 100644 --- a/go.mod +++ b/go.mod @@ -8,5 +8,6 @@ require ( github.com/go-sql-driver/mysql v1.5.0 github.com/jedib0t/go-pretty v4.3.0+incompatible github.com/mattn/go-runewidth v0.0.7 // indirect + github.com/prometheus/client_golang v0.9.3 github.com/spf13/cobra v1.0.0 ) diff --git a/go.sum b/go.sum index 57b8bff..780da12 100644 --- a/go.sum +++ b/go.sum @@ -31,6 +31,7 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGL github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= @@ -125,6 +126,7 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= @@ -225,7 +227,6 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kyoh86/exportloopref v0.1.7/go.mod h1:h1rDl2Kdj97+Kwh4gdz3ujE7XHmH51Q0lUiZ1z4NLj8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= @@ -243,6 +244,7 @@ github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+tw github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -285,12 +287,16 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= @@ -331,7 +337,6 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -421,7 +426,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -549,6 +553,7 @@ google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -567,7 +572,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tpcc/metrics.go b/tpcc/metrics.go new file mode 100644 index 0000000..f1de69d --- /dev/null +++ b/tpcc/metrics.go @@ -0,0 +1,98 @@ +package tpcc + +import "github.com/prometheus/client_golang/prometheus" + +var ( + elapsedVec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "elapsed", + Help: "The real elapsed time per interval", + }, []string{"op"}, + ) + sumVec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "sum", + Help: "The total latency per interval", + }, []string{"op"}, + ) + countVec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "count", + Help: "The total count of transactions", + }, []string{"op"}, + ) + opsVec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "ops", + Help: "The number of op per second", + }, []string{"op"}, + ) + avgVec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "avg", + Help: "The avarge latency", + }, []string{"op"}, + ) + p50Vec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "p50", + Help: "P50 latency", + }, []string{"op"}, + ) + p90Vec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "p90", + Help: "P90 latency", + }, []string{"op"}, + ) + p95Vec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "p95", + Help: "P95 latency", + }, []string{"op"}, + ) + p99Vec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "p99", + Help: "P99 latency", + }, []string{"op"}, + ) + p999Vec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "p999", + Help: "p999 latency", + }, []string{"op"}, + ) + maxVec = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tpc", + Subsystem: "tpcc", + Name: "max", + Help: "Max latency", + }, []string{"op"}, + ) +) + +func init() { + prometheus.MustRegister(elapsedVec, sumVec, countVec, opsVec, avgVec, p50Vec, p90Vec, p95Vec, p99Vec, p999Vec, maxVec) +} diff --git a/tpcc/workload.go b/tpcc/workload.go index fc49cb8..f7179b1 100644 --- a/tpcc/workload.go +++ b/tpcc/workload.go @@ -295,18 +295,28 @@ func (w *Workloader) Cleanup(ctx context.Context, threadID int) error { } func outputRtMeasurement(prefix string, opMeasurement map[string]*measurement.Histogram) { - keys := make([]string, len(opMeasurement)) - var i = 0 + keys := make([]string, 0, len(opMeasurement)) for k := range opMeasurement { - keys[i] = k - i += 1 + keys = append(keys, k) } sort.Strings(keys) for _, op := range keys { hist := opMeasurement[op] if !hist.Empty() { - fmt.Printf("%s%-6s - %s\n", prefix, strings.ToUpper(op), hist.Summary()) + info := hist.GetInfo() + op = strings.ToUpper(op) + elapsedVec.WithLabelValues(op).Set(info.Elapsed) + sumVec.WithLabelValues(op).Set(info.Sum) + countVec.WithLabelValues(op).Set(float64(info.Count)) + opsVec.WithLabelValues(op).Set(info.Ops) + avgVec.WithLabelValues(op).Set(info.Avg) + p50Vec.WithLabelValues(op).Set(info.P50) + p90Vec.WithLabelValues(op).Set(info.P90) + p99Vec.WithLabelValues(op).Set(info.P99) + p999Vec.WithLabelValues(op).Set(info.P999) + maxVec.WithLabelValues(op).Set(info.Max) + fmt.Printf("%s%-6s - %s\n", prefix, op, hist.Summary()) } } }