Skip to content

Commit dab2ce8

Browse files
authored
feat: Add optional Sentry support (#2386)
Part of https://linear.app/cloudquery/issue/ENG-2544/ ~Goes with cloudquery/plugin-pb-go#600 Brings back sentry init and panic handling from #1724
1 parent 2daf99c commit dab2ce8

File tree

8 files changed

+74
-0
lines changed

8 files changed

+74
-0
lines changed

examples/simple_plugin/go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ require (
3737
github.com/cloudquery/plugin-pb-go v1.27.5 // indirect
3838
github.com/cloudquery/plugin-sdk/v2 v2.7.0 // indirect
3939
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
40+
github.com/getsentry/sentry-go v0.40.0 // indirect
4041
github.com/ghodss/yaml v1.0.0 // indirect
4142
github.com/go-logr/logr v1.4.3 // indirect
4243
github.com/go-logr/stdr v1.2.2 // indirect

examples/simple_plugin/go.sum

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,12 @@ github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxK
7171
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
7272
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
7373
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
74+
github.com/getsentry/sentry-go v0.40.0 h1:VTJMN9zbTvqDqPwheRVLcp0qcUcM+8eFivvGocAaSbo=
75+
github.com/getsentry/sentry-go v0.40.0/go.mod h1:eRXCoh3uvmjQLY6qu63BjUZnaBu5L5WhMV1RwYO8W5s=
7476
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
7577
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
78+
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
79+
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
7680
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
7781
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
7882
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -135,6 +139,9 @@ github.com/oapi-codegen/runtime v1.1.2 h1:P2+CubHq8fO4Q6fV1tqDBZHCwpVpvPg7oKiYzQ
135139
github.com/oapi-codegen/runtime v1.1.2/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
136140
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
137141
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
142+
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
143+
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
144+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
138145
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
139146
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
140147
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ require (
1313
github.com/cloudquery/codegen v0.3.35
1414
github.com/cloudquery/plugin-pb-go v1.27.5
1515
github.com/cloudquery/plugin-sdk/v2 v2.7.0
16+
github.com/getsentry/sentry-go v0.40.0
1617
github.com/goccy/go-json v0.10.5
1718
github.com/golang/mock v1.6.0
1819
github.com/google/go-cmp v0.7.0

go.sum

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,12 @@ github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxK
7474
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
7575
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
7676
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
77+
github.com/getsentry/sentry-go v0.40.0 h1:VTJMN9zbTvqDqPwheRVLcp0qcUcM+8eFivvGocAaSbo=
78+
github.com/getsentry/sentry-go v0.40.0/go.mod h1:eRXCoh3uvmjQLY6qu63BjUZnaBu5L5WhMV1RwYO8W5s=
7779
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
7880
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
81+
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
82+
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
7983
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
8084
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
8185
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -138,6 +142,9 @@ github.com/oapi-codegen/runtime v1.1.2 h1:P2+CubHq8fO4Q6fV1tqDBZHCwpVpvPg7oKiYzQ
138142
github.com/oapi-codegen/runtime v1.1.2/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
139143
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
140144
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
145+
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
146+
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
147+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
141148
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
142149
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
143150
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=

scheduler/queue/worker.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/cloudquery/plugin-sdk/v4/scheduler/metrics"
1414
"github.com/cloudquery/plugin-sdk/v4/scheduler/resolvers"
1515
"github.com/cloudquery/plugin-sdk/v4/schema"
16+
"github.com/getsentry/sentry-go"
1617
"github.com/rs/zerolog"
1718
"github.com/samber/lo"
1819
"go.opentelemetry.io/otel"
@@ -103,6 +104,10 @@ func (w *worker) resolveTable(ctx context.Context, table *schema.Table, client s
103104
stack := fmt.Sprintf("%s\n%s", err, string(debug.Stack()))
104105
logger.Error().Interface("error", err).Str("stack", stack).Msg("table resolver finished with panic")
105106
w.metrics.AddPanics(ctx, 1, selector)
107+
sentry.WithScope(func(scope *sentry.Scope) {
108+
scope.SetTag("table", table.Name)
109+
sentry.CurrentHub().CaptureMessage(stack)
110+
})
106111
}
107112
close(res)
108113
}()

scheduler/resolvers/resolvers.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/cloudquery/plugin-sdk/v4/caser"
1010
"github.com/cloudquery/plugin-sdk/v4/scheduler/metrics"
1111
"github.com/cloudquery/plugin-sdk/v4/schema"
12+
"github.com/getsentry/sentry-go"
1213
"github.com/rs/zerolog"
1314
"github.com/thoas/go-funk"
1415
)
@@ -20,6 +21,11 @@ func resolveColumn(ctx context.Context, logger zerolog.Logger, m *metrics.Metric
2021
stack := fmt.Sprintf("%s\n%s", err, string(debug.Stack()))
2122
logger.Error().Str("column", column.Name).Interface("error", err).TimeDiff("duration", time.Now(), columnStartTime).Str("stack", stack).Msg("column resolver finished with panic")
2223
m.AddPanics(ctx, 1, selector)
24+
sentry.WithScope(func(scope *sentry.Scope) {
25+
scope.SetTag("table", resource.Table.Name)
26+
scope.SetTag("column", column.Name)
27+
sentry.CurrentHub().CaptureMessage(stack)
28+
})
2329
}
2430
}()
2531

scheduler/scheduler_dfs.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/cloudquery/plugin-sdk/v4/scheduler/metrics"
1414
"github.com/cloudquery/plugin-sdk/v4/scheduler/resolvers"
1515
"github.com/cloudquery/plugin-sdk/v4/schema"
16+
"github.com/getsentry/sentry-go"
1617
"github.com/samber/lo"
1718
"go.opentelemetry.io/otel"
1819
"go.opentelemetry.io/otel/attribute"
@@ -119,6 +120,10 @@ func (s *syncClient) resolveTableDfs(ctx context.Context, table *schema.Table, c
119120
stack := fmt.Sprintf("%s\n%s", err, string(debug.Stack()))
120121
logger.Error().Interface("error", err).Str("stack", stack).Msg("table resolver finished with panic")
121122
s.metrics.AddPanics(ctx, 1, selector)
123+
sentry.WithScope(func(scope *sentry.Scope) {
124+
scope.SetTag("table", table.Name)
125+
sentry.CurrentHub().CaptureMessage(stack)
126+
})
122127
}
123128
close(res)
124129
}()

serve/plugin.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@ package serve
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"net"
78
"os"
89
"os/signal"
10+
"strconv"
911
"strings"
1012
"syscall"
1113

1214
"github.com/cloudquery/plugin-sdk/v4/helpers/grpczerolog"
1315
"github.com/cloudquery/plugin-sdk/v4/plugin"
1416
"github.com/cloudquery/plugin-sdk/v4/premium"
1517
"github.com/cloudquery/plugin-sdk/v4/types"
18+
"github.com/getsentry/sentry-go"
1619

1720
pbDestinationV0 "github.com/cloudquery/plugin-pb-go/pb/destination/v0"
1821
pbDestinationV1 "github.com/cloudquery/plugin-pb-go/pb/destination/v1"
@@ -37,13 +40,20 @@ type PluginServe struct {
3740
plugin *plugin.Plugin
3841
args []string
3942
destinationV0V1Server bool
43+
sentryDSN string
4044
testListener bool
4145
testListenerConn *bufconn.Listener
4246
versions []int
4347
}
4448

4549
type PluginOption func(*PluginServe)
4650

51+
func WithPluginSentryDSN(dsn string) PluginOption {
52+
return func(s *PluginServe) {
53+
s.sentryDSN = dsn
54+
}
55+
}
56+
4757
// WithDestinationV0V1Server is used to include destination v0 and v1 server to work
4858
// with older sources
4959
func WithDestinationV0V1Server() PluginOption {
@@ -123,6 +133,11 @@ func (s *PluginServe) newCmdPluginServe() *cobra.Command {
123133
Long: servePluginShort,
124134
Args: cobra.NoArgs,
125135
RunE: func(cmd *cobra.Command, _ []string) error {
136+
doSentry, _ := strconv.ParseBool(os.Getenv("CQ_SENTRY_ENABLED"))
137+
if doSentry && noSentry {
138+
return errors.New("CQ_SENTRY_ENABLED and --no-sentry cannot be used together")
139+
}
140+
126141
zerologLevel, err := zerolog.ParseLevel(logLevel.String())
127142
if err != nil {
128143
return err
@@ -204,6 +219,33 @@ func (s *PluginServe) newCmdPluginServe() *cobra.Command {
204219
Versions: []int32{0, 1, 2, 3},
205220
})
206221

222+
version := s.plugin.Version()
223+
224+
if doSentry && len(s.sentryDSN) > 0 && !strings.EqualFold(version, "development") && !noSentry {
225+
err = sentry.Init(sentry.ClientOptions{
226+
Dsn: s.sentryDSN,
227+
Debug: false,
228+
AttachStacktrace: false,
229+
Release: version,
230+
Transport: sentry.NewHTTPSyncTransport(),
231+
ServerName: "oss", // set to "oss" on purpose to avoid sending any identifying information
232+
// https://docs.sentry.io/platforms/go/configuration/options/#removing-default-integrations
233+
Integrations: func(integrations []sentry.Integration) []sentry.Integration {
234+
var filteredIntegrations []sentry.Integration
235+
for _, integration := range integrations {
236+
if integration.Name() == "Modules" {
237+
continue
238+
}
239+
filteredIntegrations = append(filteredIntegrations, integration)
240+
}
241+
return filteredIntegrations
242+
},
243+
})
244+
if err != nil {
245+
log.Error().Err(err).Msg("Error initializing sentry")
246+
}
247+
}
248+
207249
ctx := cmd.Context()
208250
c := make(chan os.Signal, 1)
209251
signal.Notify(c, os.Interrupt, syscall.SIGTERM)

0 commit comments

Comments
 (0)