From 05b4713c5f84b4bdf66258d6ccf9721937434a62 Mon Sep 17 00:00:00 2001 From: Christian Simon Date: Mon, 12 Sep 2022 15:24:39 +0100 Subject: [PATCH 1/2] Add support for parca profilestore API --- pkg/distributor/distributor.go | 45 ++++++++++++++++++++++++++++++++ pkg/fire/modules.go | 7 ++++- pkg/firedb/head_test.go | 1 + pkg/firedb/locations.go | 5 +++- pkg/firedb/profiles.go | 1 - pkg/firedb/testdata/parca-agent | Bin 0 -> 10871 bytes 6 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 pkg/firedb/testdata/parca-agent diff --git a/pkg/distributor/distributor.go b/pkg/distributor/distributor.go index 3eebe3d75..e85f66af6 100644 --- a/pkg/distributor/distributor.go +++ b/pkg/distributor/distributor.go @@ -12,11 +12,13 @@ import ( "github.com/bufbuild/connect-go" "github.com/go-kit/log" + "github.com/go-kit/log/level" "github.com/google/uuid" "github.com/grafana/dskit/ring" ring_client "github.com/grafana/dskit/ring/client" "github.com/grafana/dskit/services" "github.com/opentracing/opentracing-go" + parcastorev1 "github.com/parca-dev/parca/gen/proto/go/parca/profilestore/v1alpha1" "github.com/parca-dev/parca/pkg/scrape" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" @@ -147,6 +149,8 @@ func (d *Distributor) Push(ctx context.Context, req *connect.Request[pushv1.Push p.Normalize() + level.Warn(d.logger).Log("msg", "received sample", "labels", firemodel.LabelPairsString(series.Labels), "type", p.StringTable[p.SampleType[0].Type]) + // reuse the data buffer if possible size := p.SizeVT() if cap(data) < size { @@ -309,3 +313,44 @@ func TokenFor(tenantID, labels string) uint32 { _, _ = h.Write([]byte(labels)) return h.Sum32() } + +func (d *Distributor) ParcaProfileStore() parcastorev1.ProfileStoreServiceServer { + return &ParcaProfileStore{ + distributor: d, + } +} + +type ParcaProfileStore struct { + parcastorev1.UnimplementedProfileStoreServiceServer + distributor *Distributor +} + +func (s *ParcaProfileStore) WriteRaw(ctx context.Context, req *parcastorev1.WriteRawRequest) (*parcastorev1.WriteRawResponse, error) { + nReq := &pushv1.PushRequest{ + Series: make([]*pushv1.RawProfileSeries, len(req.Series)), + } + for idxSeries, series := range req.Series { + nReq.Series[idxSeries] = &pushv1.RawProfileSeries{ + Samples: make([]*pushv1.RawSample, len(series.Samples)), + Labels: make([]*commonv1.LabelPair, len(series.Labels.Labels)), + } + for idx, l := range series.Labels.Labels { + nReq.Series[idxSeries].Labels[idx] = &commonv1.LabelPair{ + Name: l.Name, + Value: l.Value, + } + } + for idx, s := range series.Samples { + nReq.Series[idxSeries].Samples[idx] = &pushv1.RawSample{ + RawProfile: s.RawProfile, + } + } + level.Warn(s.distributor.logger).Log("msg", "converted parca sample", "labels", firemodel.LabelPairsString(nReq.Series[idxSeries].Labels)) + } + + if _, err := s.distributor.Push(ctx, connect.NewRequest(nReq)); err != nil { + return nil, err + } + + return &parcastorev1.WriteRawResponse{}, nil +} diff --git a/pkg/fire/modules.go b/pkg/fire/modules.go index a872d60a4..fe8452016 100644 --- a/pkg/fire/modules.go +++ b/pkg/fire/modules.go @@ -13,8 +13,8 @@ import ( "github.com/grafana/dskit/ring" "github.com/grafana/dskit/services" grpcgw "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + parcastorev1 "github.com/parca-dev/parca/gen/proto/go/parca/profilestore/v1alpha1" "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/version" "github.com/thanos-io/thanos/pkg/discovery/dns" @@ -107,7 +107,12 @@ func (f *Fire) initDistributor() (services.Service, error) { // initialise direct pusher, this overwrites the default HTTP client f.pusherClient = d + // register pusher pushv1connect.RegisterPusherServiceHandler(f.Server.HTTP, d) + + // register parca compatible profile store + parcastorev1.RegisterProfileStoreServiceServer(f.Server.GRPC, d.ParcaProfileStore()) + return d, nil } diff --git a/pkg/firedb/head_test.go b/pkg/firedb/head_test.go index 936cdf98c..e22abcdb9 100644 --- a/pkg/firedb/head_test.go +++ b/pkg/firedb/head_test.go @@ -301,6 +301,7 @@ func TestHeadIngestRealProfiles(t *testing.T) { profilePaths := []string{ "testdata/heap", "testdata/profile", + "testdata/parca-agent", } head, err := NewHead(t.TempDir()) diff --git a/pkg/firedb/locations.go b/pkg/firedb/locations.go index ca9416903..199b0118d 100644 --- a/pkg/firedb/locations.go +++ b/pkg/firedb/locations.go @@ -53,7 +53,10 @@ func (*locationsHelper) addToRewriter(r *rewriter, elemRewriter idConversionTabl } func (*locationsHelper) rewrite(r *rewriter, l *profilev1.Location) error { - r.mappings.rewriteUint64(&l.MappingId) + // ignore mappingIDs of 0, as they indicate that it has already been symbolized. + if l.MappingId != 0 { + r.mappings.rewriteUint64(&l.MappingId) + } for pos := range l.Line { r.functions.rewriteUint64(&l.Line[pos].FunctionId) diff --git a/pkg/firedb/profiles.go b/pkg/firedb/profiles.go index becb36010..600461693 100644 --- a/pkg/firedb/profiles.go +++ b/pkg/firedb/profiles.go @@ -280,7 +280,6 @@ func (*profilesHelper) key(s *schemav1.Profile) noKey { } func (*profilesHelper) addToRewriter(r *rewriter, elemRewriter idConversionTable) { - r.locations = elemRewriter } func (*profilesHelper) rewrite(r *rewriter, s *schemav1.Profile) error { diff --git a/pkg/firedb/testdata/parca-agent b/pkg/firedb/testdata/parca-agent new file mode 100644 index 0000000000000000000000000000000000000000..78aed6b7630046bafdf79737d074dffa2b5026df GIT binary patch literal 10871 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%0A!0Sn_nP6XL$N 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 ivmkoceMP2~Kp-Tm|NZG5{= Date: Tue, 13 Sep 2022 16:43:18 +0100 Subject: [PATCH 2/2] Implement a fake debuginfo server --- pkg/debuginfo/fake.go | 47 +++++++++++++++++++++++++++++++++++++++++++ pkg/fire/modules.go | 3 +++ 2 files changed, 50 insertions(+) create mode 100644 pkg/debuginfo/fake.go diff --git a/pkg/debuginfo/fake.go b/pkg/debuginfo/fake.go new file mode 100644 index 000000000..4515c339c --- /dev/null +++ b/pkg/debuginfo/fake.go @@ -0,0 +1,47 @@ +package debuginfo + +import ( + "context" + + "github.com/go-kit/log" + "github.com/go-kit/log/level" + + parcadebuginfov1 "github.com/parca-dev/parca/gen/proto/go/parca/debuginfo/v1alpha1" +) + +type fakeDebugInfo struct { + parcadebuginfov1.UnimplementedDebugInfoServiceServer + + logger log.Logger +} + +func New(logger log.Logger) parcadebuginfov1.DebugInfoServiceServer { + return &fakeDebugInfo{ + logger: logger, + } +} + +// Exists returns true if the given build_id has debug info uploaded for it. +func (f *fakeDebugInfo) Exists(ctx context.Context, req *parcadebuginfov1.ExistsRequest) (*parcadebuginfov1.ExistsResponse, error) { + level.Warn(f.logger).Log("msg", "received exists request", "buildid", req.GetBuildId(), "hash", req.GetHash()) + + return &parcadebuginfov1.ExistsResponse{ + Exists: false, + }, nil +} + +// Upload ingests debug info for a given build_id +func (f *fakeDebugInfo) Upload(u parcadebuginfov1.DebugInfoService_UploadServer) error { + req, err := u.Recv() + if err != nil { + return err + } + level.Warn(f.logger).Log("msg", "received upload", "buildid", req.GetInfo().GetBuildId(), "hash", req.GetInfo().GetHash()) + + return nil +} + +// Download returns the debug info for a given build_id. +func (_ *fakeDebugInfo) Download(*parcadebuginfov1.DownloadRequest, parcadebuginfov1.DebugInfoService_DownloadServer) error { + return nil +} diff --git a/pkg/fire/modules.go b/pkg/fire/modules.go index fe8452016..b72cd3828 100644 --- a/pkg/fire/modules.go +++ b/pkg/fire/modules.go @@ -13,6 +13,7 @@ import ( "github.com/grafana/dskit/ring" "github.com/grafana/dskit/services" grpcgw "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + parcadebuginfov1 "github.com/parca-dev/parca/gen/proto/go/parca/debuginfo/v1alpha1" parcastorev1 "github.com/parca-dev/parca/gen/proto/go/parca/profilestore/v1alpha1" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" @@ -24,6 +25,7 @@ import ( "golang.org/x/net/http2/h2c" "github.com/grafana/fire/pkg/agent" + "github.com/grafana/fire/pkg/debuginfo" "github.com/grafana/fire/pkg/distributor" "github.com/grafana/fire/pkg/firedb" agentv1 "github.com/grafana/fire/pkg/gen/agent/v1" @@ -112,6 +114,7 @@ func (f *Fire) initDistributor() (services.Service, error) { // register parca compatible profile store parcastorev1.RegisterProfileStoreServiceServer(f.Server.GRPC, d.ParcaProfileStore()) + parcadebuginfov1.RegisterDebugInfoServiceServer(f.Server.GRPC, debuginfo.New(f.logger)) return d, nil }