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  }