Provisioning: Add metrics around webhooks (#111453)
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
|
||||
@@ -12,10 +13,12 @@ import (
|
||||
"github.com/grafana/grafana/apps/provisioning/pkg/repository"
|
||||
"github.com/grafana/grafana/pkg/registry/apis/provisioning/jobs"
|
||||
"github.com/grafana/grafana/pkg/registry/apis/provisioning/resources"
|
||||
"github.com/grafana/grafana/pkg/registry/apis/provisioning/utils"
|
||||
"github.com/grafana/grafana/pkg/services/apiserver"
|
||||
"github.com/grafana/grafana/pkg/services/rendering"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/resource"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
func ProvidePullRequestWorker(
|
||||
@@ -23,6 +26,7 @@ func ProvidePullRequestWorker(
|
||||
renderer rendering.Service,
|
||||
blobstore resource.ResourceClient,
|
||||
configProvider apiserver.RestConfigProvider,
|
||||
registry prometheus.Registerer,
|
||||
) *PullRequestWorker {
|
||||
urlProvider := func(_ string) string {
|
||||
return cfg.AppURL
|
||||
@@ -33,10 +37,10 @@ func ProvidePullRequestWorker(
|
||||
clients := resources.NewClientFactory(configProvider)
|
||||
parsers := resources.NewParserFactory(clients)
|
||||
screenshotRenderer := NewScreenshotRenderer(renderer, blobstore)
|
||||
evaluator := NewEvaluator(screenshotRenderer, parsers, urlProvider)
|
||||
evaluator := NewEvaluator(screenshotRenderer, parsers, urlProvider, registry)
|
||||
commenter := NewCommenter()
|
||||
|
||||
return NewPullRequestWorker(evaluator, commenter)
|
||||
return NewPullRequestWorker(evaluator, commenter, registry)
|
||||
}
|
||||
|
||||
//go:generate mockery --name=PullRequestRepo --structname=MockPullRequestRepo --inpackage --filename=mock_pullrequest_repo.go --with-expecter
|
||||
@@ -60,12 +64,15 @@ type Commenter interface {
|
||||
type PullRequestWorker struct {
|
||||
evaluator Evaluator
|
||||
commenter Commenter
|
||||
metrics pullRequestMetrics
|
||||
}
|
||||
|
||||
func NewPullRequestWorker(evaluator Evaluator, commenter Commenter) *PullRequestWorker {
|
||||
func NewPullRequestWorker(evaluator Evaluator, commenter Commenter, registry prometheus.Registerer) *PullRequestWorker {
|
||||
metrics := registerPullRequestMetrics(registry)
|
||||
return &PullRequestWorker{
|
||||
evaluator: evaluator,
|
||||
commenter: commenter,
|
||||
metrics: metrics,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,30 +87,42 @@ func (c *PullRequestWorker) Process(ctx context.Context,
|
||||
) error {
|
||||
cfg := repo.Config().Spec
|
||||
opts := job.Spec.PullRequest
|
||||
startTime := time.Now()
|
||||
outcome := utils.ErrorOutcome
|
||||
defer func() {
|
||||
duration := time.Since(startTime)
|
||||
c.metrics.recordProcessed(outcome, duration)
|
||||
}()
|
||||
|
||||
if opts == nil {
|
||||
return apierrors.NewBadRequest("missing spec.pr")
|
||||
}
|
||||
|
||||
logger := logging.FromContext(ctx).With("pr", opts.PR, "repo", repo.Config().GetName(), "namespace", job.GetNamespace())
|
||||
|
||||
if opts.Ref == "" {
|
||||
logger.Debug("missing spec.ref")
|
||||
return apierrors.NewBadRequest("missing spec.ref")
|
||||
}
|
||||
|
||||
// FIXME: this is leaky because it's supposed to be already a PullRequestRepo
|
||||
if cfg.GitHub == nil {
|
||||
logger.Debug("expecting github configuration")
|
||||
return apierrors.NewBadRequest("expecting github configuration")
|
||||
}
|
||||
|
||||
reader, ok := repo.(repository.Reader)
|
||||
if !ok {
|
||||
logger.Debug("pull request job submitted targeting repository that is not a Reader")
|
||||
return errors.New("pull request job submitted targeting repository that is not a Reader")
|
||||
}
|
||||
|
||||
prRepo, ok := repo.(PullRequestRepo)
|
||||
if !ok {
|
||||
logger.Debug("pull request job submitted targeting repository that is not a PullRequestRepo")
|
||||
return fmt.Errorf("repository is not a pull request repository")
|
||||
}
|
||||
|
||||
logger := logging.FromContext(ctx).With("pr", opts.PR)
|
||||
logger.Info("process pull request")
|
||||
defer logger.Info("pull request processed")
|
||||
|
||||
@@ -112,6 +131,7 @@ func (c *PullRequestWorker) Process(ctx context.Context,
|
||||
base := cfg.GitHub.Branch
|
||||
files, err := prRepo.CompareFiles(ctx, base, opts.Ref)
|
||||
if err != nil {
|
||||
logger.Error("failed to list pull request files", "error", err)
|
||||
return fmt.Errorf("failed to list pull request files: %w", err)
|
||||
}
|
||||
|
||||
@@ -123,12 +143,16 @@ func (c *PullRequestWorker) Process(ctx context.Context,
|
||||
|
||||
changeInfo, err := c.evaluator.Evaluate(ctx, reader, *opts, files, progress)
|
||||
if err != nil {
|
||||
logger.Error("failed to calculate changes", "error", err)
|
||||
return fmt.Errorf("calculate changes: %w", err)
|
||||
}
|
||||
|
||||
if err := c.commenter.Comment(ctx, prRepo, opts.PR, changeInfo); err != nil {
|
||||
c.metrics.recordCommentPosted(utils.ErrorOutcome)
|
||||
return fmt.Errorf("comment pull request: %w", err)
|
||||
}
|
||||
outcome = utils.SuccessOutcome
|
||||
c.metrics.recordCommentPosted(utils.SuccessOutcome)
|
||||
logger.Info("preview comment added")
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user