diff --git a/Makefile b/Makefile index 26ee5216de..3dc6b04ae1 100644 --- a/Makefile +++ b/Makefile @@ -249,7 +249,7 @@ $(BIN)/protoc-gen-connect-go-mux: Makefile go.mod $(BIN)/protoc-gen-go-vtproto: Makefile go.mod @mkdir -p $(@D) - GOBIN=$(abspath $(@D)) $(GO) install github.com/planetscale/vtprotobuf/cmd/protoc-gen-go-vtproto@v0.4.0 + GOBIN=$(abspath $(@D)) $(GO) install github.com/grafana/vtprotobuf/cmd/protoc-gen-go-vtproto@69fa34dad3472084bcae0b557e8813e6d4678f2b $(BIN)/protoc-gen-openapiv2: Makefile go.mod @mkdir -p $(@D) diff --git a/api/buf.gen.yaml b/api/buf.gen.yaml index e294daf851..401ffc95dd 100644 --- a/api/buf.gen.yaml +++ b/api/buf.gen.yaml @@ -18,6 +18,11 @@ plugins: - features=marshal+unmarshal+size+pool+grpc+pool+clone - pool=github.com/grafana/pyroscope/api/gen/proto/go/google/v1.Profile - pool=github.com/grafana/pyroscope/api/gen/proto/go/google/v1.Sample + - pool=github.com/grafana/pyroscope/api/gen/proto/go/google/v1.Mapping + - pool=github.com/grafana/pyroscope/api/gen/proto/go/google/v1.Function + - pool=github.com/grafana/pyroscope/api/gen/proto/go/google/v1.Location + - pool=github.com/grafana/pyroscope/api/gen/proto/go/google/v1.Label + - pool=github.com/grafana/pyroscope/api/gen/proto/go/google/v1.Line - name: connect-go out: gen/proto/go diff --git a/api/gen/proto/go/agent/v1/agent_vtproto.pb.go b/api/gen/proto/go/agent/v1/agent_vtproto.pb.go index 70929b4db7..4bf307944a 100644 --- a/api/gen/proto/go/agent/v1/agent_vtproto.pb.go +++ b/api/gen/proto/go/agent/v1/agent_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: agent/v1/agent.proto package agentv1 diff --git a/api/gen/proto/go/google/v1/profile_vtproto.pb.go b/api/gen/proto/go/google/v1/profile_vtproto.pb.go index 4f289c0d85..f56e96075a 100644 --- a/api/gen/proto/go/google/v1/profile_vtproto.pb.go +++ b/api/gen/proto/go/google/v1/profile_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: google/v1/profile.proto package googlev1 @@ -896,14 +896,36 @@ var vtprotoPool_Profile = sync.Pool{ } func (m *Profile) ResetVT() { + for _, mm := range m.SampleType { + mm.Reset() + } + f0 := m.SampleType[:0] for _, mm := range m.Sample { mm.ResetVT() } - f0 := m.StringTable[:0] - f1 := m.Comment[:0] + f1 := m.Sample[:0] + for _, mm := range m.Mapping { + mm.ResetVT() + } + f2 := m.Mapping[:0] + for _, mm := range m.Location { + mm.ResetVT() + } + f3 := m.Location[:0] + for _, mm := range m.Function { + mm.ResetVT() + } + f4 := m.Function[:0] + f5 := m.StringTable[:0] + f6 := m.Comment[:0] m.Reset() - m.StringTable = f0 - m.Comment = f1 + m.SampleType = f0 + m.Sample = f1 + m.Mapping = f2 + m.Location = f3 + m.Function = f4 + m.StringTable = f5 + m.Comment = f6 } func (m *Profile) ReturnToVTPool() { if m != nil { @@ -924,9 +946,14 @@ var vtprotoPool_Sample = sync.Pool{ func (m *Sample) ResetVT() { f0 := m.LocationId[:0] f1 := m.Value[:0] + for _, mm := range m.Label { + mm.ResetVT() + } + f2 := m.Label[:0] m.Reset() m.LocationId = f0 m.Value = f1 + m.Label = f2 } func (m *Sample) ReturnToVTPool() { if m != nil { @@ -937,6 +964,106 @@ func (m *Sample) ReturnToVTPool() { func SampleFromVTPool() *Sample { return vtprotoPool_Sample.Get().(*Sample) } + +var vtprotoPool_Label = sync.Pool{ + New: func() interface{} { + return &Label{} + }, +} + +func (m *Label) ResetVT() { + m.Reset() +} +func (m *Label) ReturnToVTPool() { + if m != nil { + m.ResetVT() + vtprotoPool_Label.Put(m) + } +} +func LabelFromVTPool() *Label { + return vtprotoPool_Label.Get().(*Label) +} + +var vtprotoPool_Mapping = sync.Pool{ + New: func() interface{} { + return &Mapping{} + }, +} + +func (m *Mapping) ResetVT() { + m.Reset() +} +func (m *Mapping) ReturnToVTPool() { + if m != nil { + m.ResetVT() + vtprotoPool_Mapping.Put(m) + } +} +func MappingFromVTPool() *Mapping { + return vtprotoPool_Mapping.Get().(*Mapping) +} + +var vtprotoPool_Location = sync.Pool{ + New: func() interface{} { + return &Location{} + }, +} + +func (m *Location) ResetVT() { + for _, mm := range m.Line { + mm.ResetVT() + } + f0 := m.Line[:0] + m.Reset() + m.Line = f0 +} +func (m *Location) ReturnToVTPool() { + if m != nil { + m.ResetVT() + vtprotoPool_Location.Put(m) + } +} +func LocationFromVTPool() *Location { + return vtprotoPool_Location.Get().(*Location) +} + +var vtprotoPool_Line = sync.Pool{ + New: func() interface{} { + return &Line{} + }, +} + +func (m *Line) ResetVT() { + m.Reset() +} +func (m *Line) ReturnToVTPool() { + if m != nil { + m.ResetVT() + vtprotoPool_Line.Put(m) + } +} +func LineFromVTPool() *Line { + return vtprotoPool_Line.Get().(*Line) +} + +var vtprotoPool_Function = sync.Pool{ + New: func() interface{} { + return &Function{} + }, +} + +func (m *Function) ResetVT() { + m.Reset() +} +func (m *Function) ReturnToVTPool() { + if m != nil { + m.ResetVT() + vtprotoPool_Function.Put(m) + } +} +func FunctionFromVTPool() *Function { + return vtprotoPool_Function.Get().(*Function) +} func (m *Profile) SizeVT() (n int) { if m == nil { return 0 @@ -2529,7 +2656,14 @@ func (m *Location) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Line = append(m.Line, &Line{}) + if len(m.Line) == cap(m.Line) { + m.Line = append(m.Line, &Line{}) + } else { + m.Line = m.Line[:len(m.Line)+1] + if m.Line[len(m.Line)-1] == nil { + m.Line[len(m.Line)-1] = &Line{} + } + } if err := m.Line[len(m.Line)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/api/gen/proto/go/ingester/v1/ingester_vtproto.pb.go b/api/gen/proto/go/ingester/v1/ingester_vtproto.pb.go index e146495559..655a539b70 100644 --- a/api/gen/proto/go/ingester/v1/ingester_vtproto.pb.go +++ b/api/gen/proto/go/ingester/v1/ingester_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: ingester/v1/ingester.proto package ingesterv1 diff --git a/api/gen/proto/go/push/v1/push_vtproto.pb.go b/api/gen/proto/go/push/v1/push_vtproto.pb.go index ef32c855eb..82612e7eb1 100644 --- a/api/gen/proto/go/push/v1/push_vtproto.pb.go +++ b/api/gen/proto/go/push/v1/push_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: push/v1/push.proto package pushv1 diff --git a/api/gen/proto/go/querier/v1/querier_vtproto.pb.go b/api/gen/proto/go/querier/v1/querier_vtproto.pb.go index 6cf7b8b8b3..40d52b0196 100644 --- a/api/gen/proto/go/querier/v1/querier_vtproto.pb.go +++ b/api/gen/proto/go/querier/v1/querier_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: querier/v1/querier.proto package querierv1 diff --git a/api/gen/proto/go/status/v1/status_vtproto.pb.go b/api/gen/proto/go/status/v1/status_vtproto.pb.go index c0cb5d761d..f9c28500ee 100644 --- a/api/gen/proto/go/status/v1/status_vtproto.pb.go +++ b/api/gen/proto/go/status/v1/status_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: status/v1/status.proto package statusv1 diff --git a/api/gen/proto/go/storegateway/v1/storegateway_vtproto.pb.go b/api/gen/proto/go/storegateway/v1/storegateway_vtproto.pb.go index ea2f998354..c266e8ff58 100644 --- a/api/gen/proto/go/storegateway/v1/storegateway_vtproto.pb.go +++ b/api/gen/proto/go/storegateway/v1/storegateway_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: storegateway/v1/storegateway.proto package storegatewayv1 diff --git a/api/gen/proto/go/types/v1/types_vtproto.pb.go b/api/gen/proto/go/types/v1/types_vtproto.pb.go index 4ffd846b58..4ce8f2dedd 100644 --- a/api/gen/proto/go/types/v1/types_vtproto.pb.go +++ b/api/gen/proto/go/types/v1/types_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: types/v1/types.proto package typesv1 diff --git a/cmd/pyroscope/help-all.txt.tmpl b/cmd/pyroscope/help-all.txt.tmpl index 57185de401..29345abac6 100644 --- a/cmd/pyroscope/help-all.txt.tmpl +++ b/cmd/pyroscope/help-all.txt.tmpl @@ -1,4 +1,4 @@ -Usage of ./phlare: +Usage of ./pyroscope: -api.base-url string base URL for when the server is behind a reverse proxy with a different path -auth.multitenancy-enabled diff --git a/cmd/pyroscope/help.txt.tmpl b/cmd/pyroscope/help.txt.tmpl index 949d97eb8d..1d82f02787 100644 --- a/cmd/pyroscope/help.txt.tmpl +++ b/cmd/pyroscope/help.txt.tmpl @@ -1,4 +1,4 @@ -Usage of ./phlare: +Usage of ./pyroscope: -api.base-url string base URL for when the server is behind a reverse proxy with a different path -auth.multitenancy-enabled diff --git a/cmd/pyroscope/main_test.go b/cmd/pyroscope/main_test.go index 76ab58bfcc..1dffc2811c 100644 --- a/cmd/pyroscope/main_test.go +++ b/cmd/pyroscope/main_test.go @@ -110,7 +110,7 @@ func TestHelp(t *testing.T) { co := test.CaptureOutput(t) - const cmd = "./phlare" + const cmd = "./pyroscope" os.Args = []string{cmd, tc.arg} // reset default flags diff --git a/pkg/frontend/frontendpb/frontend_vtproto.pb.go b/pkg/frontend/frontendpb/frontend_vtproto.pb.go index 15ca8efa1e..376f377c80 100644 --- a/pkg/frontend/frontendpb/frontend_vtproto.pb.go +++ b/pkg/frontend/frontendpb/frontend_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: frontend/frontendpb/frontend.proto package frontendpb diff --git a/pkg/og/convert/jfr/jfr_labels_vtproto.pb.go b/pkg/og/convert/jfr/jfr_labels_vtproto.pb.go index 80844c902f..2e8913ec54 100644 --- a/pkg/og/convert/jfr/jfr_labels_vtproto.pb.go +++ b/pkg/og/convert/jfr/jfr_labels_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: og/convert/jfr/jfr_labels.proto package jfr diff --git a/pkg/og/storage/tree/profile_vtproto.pb.go b/pkg/og/storage/tree/profile_vtproto.pb.go index 3fedd7b00a..815f18f014 100644 --- a/pkg/og/storage/tree/profile_vtproto.pb.go +++ b/pkg/og/storage/tree/profile_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: og/storage/tree/profile.proto package tree @@ -657,11 +657,36 @@ var vtprotoPool_Profile = sync.Pool{ } func (m *Profile) ResetVT() { - f0 := m.StringTable[:0] - f1 := m.Comment[:0] + for _, mm := range m.SampleType { + mm.Reset() + } + f0 := m.SampleType[:0] + for _, mm := range m.Sample { + mm.Reset() + } + f1 := m.Sample[:0] + for _, mm := range m.Mapping { + mm.Reset() + } + f2 := m.Mapping[:0] + for _, mm := range m.Location { + mm.Reset() + } + f3 := m.Location[:0] + for _, mm := range m.Function { + mm.Reset() + } + f4 := m.Function[:0] + f5 := m.StringTable[:0] + f6 := m.Comment[:0] m.Reset() - m.StringTable = f0 - m.Comment = f1 + m.SampleType = f0 + m.Sample = f1 + m.Mapping = f2 + m.Location = f3 + m.Function = f4 + m.StringTable = f5 + m.Comment = f6 } func (m *Profile) ReturnToVTPool() { if m != nil { diff --git a/pkg/pprof/pprof_test.go b/pkg/pprof/pprof_test.go index 1d86e92283..e767137ee6 100644 --- a/pkg/pprof/pprof_test.go +++ b/pkg/pprof/pprof_test.go @@ -2,6 +2,7 @@ package pprof import ( "math/rand" + "os" "testing" "time" @@ -183,3 +184,21 @@ func countSampleDuplicates(p *Profile) int { } return totalDupe } + +var prof *profilev1.Profile + +func BenchmarkFromRawBytes(b *testing.B) { + data, err := os.ReadFile("testdata/heap") + require.NoError(b, err) + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + err := FromBytes(data, func(p *profilev1.Profile, i int) error { + prof = p + return nil + }) + if err != nil { + b.Fatal(err) + } + } +} diff --git a/pkg/querier/stats/stats_vtproto.pb.go b/pkg/querier/stats/stats_vtproto.pb.go index fdb628099e..d0f82b7c2d 100644 --- a/pkg/querier/stats/stats_vtproto.pb.go +++ b/pkg/querier/stats/stats_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: querier/stats/stats.proto package stats diff --git a/pkg/scheduler/schedulerpb/scheduler_vtproto.pb.go b/pkg/scheduler/schedulerpb/scheduler_vtproto.pb.go index 8da0f93e2c..4085cbd348 100644 --- a/pkg/scheduler/schedulerpb/scheduler_vtproto.pb.go +++ b/pkg/scheduler/schedulerpb/scheduler_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: scheduler/schedulerpb/scheduler.proto package schedulerpb diff --git a/pkg/util/httpgrpc/httpgrpc_vtproto.pb.go b/pkg/util/httpgrpc/httpgrpc_vtproto.pb.go index 435f898c05..0111accb15 100644 --- a/pkg/util/httpgrpc/httpgrpc_vtproto.pb.go +++ b/pkg/util/httpgrpc/httpgrpc_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.4.0 +// protoc-gen-go-vtproto version: v0.0.0-20230724064928-69fa34dad347 // source: util/httpgrpc/httpgrpc.proto package httpgrpc