Skip to content

Commit 6ad13e9

Browse files
authored
Add otel instrumentation to http/grpc/sql libraries. (#2440)
* Add otel instrumentation to http/grpc/sql libraries. Also add cli arg to the clis that use those libraries to enable exporting metrics and traces. Docs under pkg/metrics. Default to off and also change prometheus default to off. Signed-off-by: Jeff Mendoza <[email protected]> * Update shutdown for otel on cli commands Signed-off-by: Jeff Mendoza <[email protected]> --------- Signed-off-by: Jeff Mendoza <[email protected]>
1 parent 3a1318b commit 6ad13e9

File tree

25 files changed

+500
-57
lines changed

25 files changed

+500
-57
lines changed

cmd/guaccollect/cmd/deps_dev.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/guacsec/guac/pkg/handler/collector"
3131
"github.com/guacsec/guac/pkg/handler/collector/deps_dev"
3232
"github.com/guacsec/guac/pkg/logging"
33+
"github.com/guacsec/guac/pkg/metrics"
3334
"github.com/spf13/cobra"
3435
"github.com/spf13/viper"
3536
)
@@ -53,6 +54,8 @@ type depsDevOptions struct {
5354
publishToQueue bool
5455
// sets artificial latency on the deps.dev collector (default to nil)
5556
addedLatency *time.Duration
57+
// enable otel
58+
enableOtel bool
5659
}
5760

5861
var depsDevCmd = &cobra.Command{
@@ -90,13 +93,27 @@ you have access to read and write to the respective blob store.`,
9093
viper.GetInt("prometheus-port"),
9194
viper.GetBool("publish-to-queue"),
9295
viper.GetString("deps-dev-latency"),
96+
viper.GetBool("enable-otel"),
9397
args,
9498
)
9599
if err != nil {
96100
fmt.Printf("unable to validate flags: %v\n", err)
97101
_ = cmd.Help()
98102
os.Exit(1)
99103
}
104+
105+
if opts.enableOtel {
106+
shutdown, err := metrics.SetupOTelSDK(ctx)
107+
if err != nil {
108+
logger.Fatalf("Error setting up Otel: %v", err)
109+
}
110+
defer func() {
111+
if err := shutdown(ctx); err != nil {
112+
logger.Errorf("Error on Otel shutdown: %v", err)
113+
}
114+
}()
115+
}
116+
100117
// Register collector
101118
depsDevCollector, err := deps_dev.NewDepsCollector(ctx, opts.dataSource, opts.poll, opts.retrieveDependencies, 30*time.Second, opts.addedLatency)
102119
if err != nil {
@@ -133,6 +150,7 @@ func validateDepsDevFlags(
133150
prometheusPort int,
134151
pubToQueue bool,
135152
addedLatencyStr string,
153+
enableOtel bool,
136154
args []string,
137155
) (depsDevOptions, error) {
138156
var opts depsDevOptions
@@ -143,6 +161,7 @@ func validateDepsDevFlags(
143161
opts.enablePrometheus = enablePrometheus
144162
opts.prometheusPort = prometheusPort
145163
opts.publishToQueue = pubToQueue
164+
opts.enableOtel = enableOtel
146165

147166
if addedLatencyStr != "" {
148167
addedLatency, err := time.ParseDuration(addedLatencyStr)

cmd/guaccollect/cmd/github.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
csubclient "github.com/guacsec/guac/pkg/collectsub/client"
2626
"github.com/guacsec/guac/pkg/collectsub/datasource/csubsource"
2727
"github.com/guacsec/guac/pkg/collectsub/datasource/inmemsource"
28+
"github.com/guacsec/guac/pkg/metrics"
2829

2930
"github.com/guacsec/guac/pkg/cli"
3031

@@ -62,6 +63,8 @@ type githubOptions struct {
6263
ownerRepoName string
6364
// enable/disable message publish to queue
6465
publishToQueue bool
66+
// enable otel
67+
enableOtel bool
6568
}
6669

6770
var githubCmd = &cobra.Command{
@@ -102,13 +105,26 @@ you have access to read and write to the respective blob store.`,
102105
viper.GetBool("use-csub"),
103106
viper.GetBool("service-poll"),
104107
viper.GetBool("publish-to-queue"),
108+
viper.GetBool("enable-otel"),
105109
args)
106110
if err != nil {
107111
fmt.Printf("unable to validate flags: %v\n", err)
108112
_ = cmd.Help()
109113
os.Exit(1)
110114
}
111115

116+
if opts.enableOtel {
117+
shutdown, err := metrics.SetupOTelSDK(ctx)
118+
if err != nil {
119+
logger.Fatalf("Error setting up Otel: %v", err)
120+
}
121+
defer func() {
122+
if err := shutdown(ctx); err != nil {
123+
logger.Errorf("Error on Otel shutdown: %v", err)
124+
}
125+
}()
126+
}
127+
112128
// GITHUB_TOKEN is the default token name
113129
ghc, err := githubclient.NewGithubClient(ctx, os.Getenv("GITHUB_TOKEN"))
114130
if err != nil {
@@ -169,6 +185,7 @@ func validateGithubFlags(
169185
useCsub,
170186
poll bool,
171187
pubToQueue bool,
188+
enableOtel bool,
172189
args []string,
173190
) (githubOptions, error) {
174191
var opts githubOptions
@@ -179,6 +196,7 @@ func validateGithubFlags(
179196
opts.sbomName = sbomName
180197
opts.workflowFileName = workflowFileName
181198
opts.publishToQueue = pubToQueue
199+
opts.enableOtel = enableOtel
182200

183201
if useCsub {
184202
csubOpts, err := csubclient.ValidateCsubClientFlags(csubAddr, csubTls, csubTlsSkipVerify)

cmd/guaccollect/cmd/license.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/guacsec/guac/pkg/certifier/components/root_package"
3131
"github.com/guacsec/guac/pkg/cli"
3232
"github.com/guacsec/guac/pkg/logging"
33+
"github.com/guacsec/guac/pkg/metrics"
3334
"github.com/spf13/cobra"
3435
"github.com/spf13/viper"
3536
)
@@ -58,6 +59,8 @@ type cdOptions struct {
5859
// last time the scan was done in hours, if not set it will return
5960
// all packages to check
6061
lastScan *int
62+
// enable otel
63+
enableOtel bool
6164
}
6265

6366
var cdCmd = &cobra.Command{
@@ -90,6 +93,7 @@ you have access to read and write to the respective blob store.`,
9093
viper.GetString("certifier-latency"),
9194
viper.GetInt("certifier-batch-size"),
9295
viper.GetInt("last-scan"),
96+
viper.GetBool("enable-otel"),
9397
)
9498
if err != nil {
9599
fmt.Printf("unable to validate flags: %v\n", err)
@@ -100,6 +104,18 @@ you have access to read and write to the respective blob store.`,
100104
ctx := logging.WithLogger(context.Background())
101105
logger := logging.FromContext(ctx)
102106

107+
if opts.enableOtel {
108+
shutdown, err := metrics.SetupOTelSDK(ctx)
109+
if err != nil {
110+
logger.Fatalf("Error setting up Otel: %v", err)
111+
}
112+
defer func() {
113+
if err := shutdown(ctx); err != nil {
114+
logger.Errorf("Error on Otel shutdown: %v", err)
115+
}
116+
}()
117+
}
118+
103119
if err := certify.RegisterCertifier(clearlydefined.NewClearlyDefinedCertifier, certifier.CertifierClearlyDefined); err != nil {
104120
logger.Fatalf("unable to register certifier: %v", err)
105121
}
@@ -134,7 +150,10 @@ func validateCDFlags(
134150
poll bool,
135151
pubToQueue bool,
136152
certifierLatencyStr string,
137-
batchSize int, lastScan int) (cdOptions, error) {
153+
batchSize int,
154+
lastScan int,
155+
enableOtel bool,
156+
) (cdOptions, error) {
138157

139158
var opts cdOptions
140159

@@ -144,6 +163,7 @@ func validateCDFlags(
144163
opts.blobAddr = blobAddr
145164
opts.poll = poll
146165
opts.publishToQueue = pubToQueue
166+
opts.enableOtel = enableOtel
147167

148168
i, err := time.ParseDuration(interval)
149169
if err != nil {

cmd/guaccollect/cmd/osv.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"github.com/guacsec/guac/pkg/handler/collector"
3939
"github.com/guacsec/guac/pkg/handler/processor"
4040
"github.com/guacsec/guac/pkg/logging"
41+
"github.com/guacsec/guac/pkg/metrics"
4142
"github.com/spf13/cobra"
4243
"github.com/spf13/viper"
4344
)
@@ -68,6 +69,8 @@ type osvOptions struct {
6869
lastScan *int
6970
// adds metadata to vulnerabities during collection
7071
addVulnMetadata bool
72+
// enable otel
73+
enableOtel bool
7174
}
7275

7376
var osvCmd = &cobra.Command{
@@ -101,6 +104,7 @@ you have access to read and write to the respective blob store.`,
101104
viper.GetInt("certifier-batch-size"),
102105
viper.GetInt("last-scan"),
103106
viper.GetBool("add-vuln-metadata"),
107+
viper.GetBool("enable-otel"),
104108
)
105109
if err != nil {
106110
fmt.Printf("unable to validate flags: %v\n", err)
@@ -111,6 +115,18 @@ you have access to read and write to the respective blob store.`,
111115
ctx := logging.WithLogger(context.Background())
112116
logger := logging.FromContext(ctx)
113117

118+
if opts.enableOtel {
119+
shutdown, err := metrics.SetupOTelSDK(ctx)
120+
if err != nil {
121+
logger.Fatalf("Error setting up Otel: %v", err)
122+
}
123+
defer func() {
124+
if err := shutdown(ctx); err != nil {
125+
logger.Errorf("Error on Otel shutdown: %v", err)
126+
}
127+
}()
128+
}
129+
114130
if err := certify.RegisterCertifier(func() certifier.Certifier {
115131
certifierOpts := []osv.CertifierOpts{}
116132
if opts.addVulnMetadata {
@@ -146,6 +162,7 @@ func validateOSVFlags(
146162
certifierLatencyStr string,
147163
batchSize int, lastScan int,
148164
addVulnMetadata bool,
165+
enableOtel bool,
149166
) (osvOptions, error) {
150167
var opts osvOptions
151168

@@ -156,6 +173,7 @@ func validateOSVFlags(
156173
opts.poll = poll
157174
opts.publishToQueue = pubToQueue
158175
opts.addVulnMetadata = addVulnMetadata
176+
opts.enableOtel = enableOtel
159177

160178
i, err := time.ParseDuration(interval)
161179
if err != nil {

cmd/guaccollect/cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func init() {
4040
"enable-prometheus",
4141
"publish-to-queue",
4242
"gql-addr",
43+
"enable-otel",
4344
})
4445
if err != nil {
4546
fmt.Fprintf(os.Stderr, "failed to setup flag: %v", err)

cmd/guacgql/cmd/root.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ var flags = struct {
3535
tlsKeyFile string
3636
debug bool
3737
tracegql bool
38+
enableOtel bool
3839
}{}
3940

4041
var rootCmd = &cobra.Command{
@@ -48,6 +49,7 @@ var rootCmd = &cobra.Command{
4849
flags.tlsKeyFile = viper.GetString("gql-tls-key-file")
4950
flags.debug = viper.GetBool("gql-debug")
5051
flags.tracegql = viper.GetBool("gql-trace")
52+
flags.enableOtel = viper.GetBool("enable-otel")
5153

5254
startServer(cmd)
5355
},
@@ -65,6 +67,7 @@ func init() {
6567
"gql-backend",
6668
"gql-trace",
6769
"enable-prometheus",
70+
"enable-otel",
6871
})
6972
if err != nil {
7073
fmt.Fprintf(os.Stderr, "failed to setup flag: %v", err)

cmd/guacgql/cmd/server.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,23 @@ import (
2626
"syscall"
2727
"time"
2828

29-
// import all known backends
30-
_ "github.com/guacsec/guac/pkg/assembler/backends/neo4j"
31-
_ "github.com/guacsec/guac/pkg/assembler/backends/neptune"
32-
_ "github.com/guacsec/guac/pkg/assembler/backends/ent/backend"
33-
_ "github.com/guacsec/guac/pkg/assembler/backends/keyvalue"
34-
_ "github.com/guacsec/guac/pkg/assembler/backends/arangodb"
35-
3629
"github.com/99designs/gqlgen/graphql/handler/debug"
3730
"github.com/99designs/gqlgen/graphql/playground"
31+
"github.com/spf13/cobra"
32+
"github.com/spf13/viper"
33+
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
34+
3835
"github.com/guacsec/guac/pkg/assembler/backends"
36+
// import all known backends
37+
_ "github.com/guacsec/guac/pkg/assembler/backends/arangodb"
38+
_ "github.com/guacsec/guac/pkg/assembler/backends/ent/backend"
39+
_ "github.com/guacsec/guac/pkg/assembler/backends/keyvalue"
40+
_ "github.com/guacsec/guac/pkg/assembler/backends/neo4j"
41+
_ "github.com/guacsec/guac/pkg/assembler/backends/neptune"
3942
"github.com/guacsec/guac/pkg/assembler/server"
4043
"github.com/guacsec/guac/pkg/logging"
4144
"github.com/guacsec/guac/pkg/metrics"
4245
"github.com/guacsec/guac/pkg/version"
43-
"github.com/spf13/cobra"
44-
"github.com/spf13/viper"
4546
)
4647

4748
func startServer(cmd *cobra.Command) {
@@ -80,6 +81,21 @@ func startServer(cmd *cobra.Command) {
8081
srvHandler = srv
8182
}
8283

84+
if flags.enableOtel {
85+
shutdown, err := metrics.SetupOTelSDK(ctx)
86+
if err != nil {
87+
logger.Fatalf("Error setting up Otel: %v", err)
88+
}
89+
90+
srvHandler = otelhttp.NewHandler(srvHandler, "/")
91+
92+
defer func() {
93+
if err := shutdown(ctx); err != nil {
94+
logger.Errorf("Error on Otel shutdown: %v", err)
95+
}
96+
}()
97+
}
98+
8399
if flags.tracegql {
84100
tracer := &debug.Tracer{}
85101
srv.Use(tracer)

0 commit comments

Comments
 (0)