github.com/quay/claircore@v1.5.28/datastore/postgres/registerscanners.go (about) 1 package postgres 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "github.com/prometheus/client_golang/prometheus" 9 "github.com/prometheus/client_golang/prometheus/promauto" 10 "github.com/quay/claircore/indexer" 11 ) 12 13 var ( 14 registerScannerCounter = promauto.NewCounterVec( 15 prometheus.CounterOpts{ 16 Namespace: "claircore", 17 Subsystem: "indexer", 18 Name: "registerscanners_total", 19 Help: "Total number of database queries issued in the RegiterScanners method.", 20 }, 21 []string{"query"}, 22 ) 23 24 registerScannerDuration = promauto.NewHistogramVec( 25 prometheus.HistogramOpts{ 26 Namespace: "claircore", 27 Subsystem: "indexer", 28 Name: "registerscanners_duration_seconds", 29 Help: "The duration of all queries issued in the RegiterScanners method", 30 }, 31 []string{"query"}, 32 ) 33 ) 34 35 func (s *IndexerStore) RegisterScanners(ctx context.Context, vs indexer.VersionedScanners) error { 36 const ( 37 insert = ` 38 INSERT 39 INTO 40 scanner (name, version, kind) 41 VALUES 42 ($1, $2, $3) 43 ON CONFLICT 44 (name, version, kind) 45 DO 46 NOTHING; 47 ` 48 exists = ` 49 SELECT 50 EXISTS( 51 SELECT 52 1 53 FROM 54 scanner 55 WHERE 56 name = $1 AND version = $2 AND kind = $3 57 ); 58 ` 59 ) 60 61 var ok bool 62 var err error 63 for _, v := range vs { 64 start := time.Now() 65 err = s.pool.QueryRow(ctx, exists, v.Name(), v.Version(), v.Kind()). 66 Scan(&ok) 67 if err != nil { 68 return fmt.Errorf("failed getting id for scanner %q: %w", v.Name(), err) 69 } 70 registerScannerCounter.WithLabelValues("exists").Add(1) 71 registerScannerDuration.WithLabelValues("exists").Observe(time.Since(start).Seconds()) 72 if ok { 73 continue 74 } 75 76 start = time.Now() 77 _, err = s.pool.Exec(ctx, insert, v.Name(), v.Version(), v.Kind()) 78 if err != nil { 79 return fmt.Errorf("failed to insert scanner %q: %w", v.Name(), err) 80 } 81 registerScannerCounter.WithLabelValues("insert").Add(1) 82 registerScannerDuration.WithLabelValues("insert").Observe(time.Since(start).Seconds()) 83 } 84 85 return nil 86 }