Skip to content

Commit

Permalink
chore(deps): 2-2 bump github.com/ViBiOh/auth/v2 from 2.14.10 to 2.14.11
Browse files Browse the repository at this point in the history
Bumps [github.com/ViBiOh/auth/v2](https://github.com/ViBiOh/auth) from 2.14.10 to 2.14.11.
- [Release notes](https://github.com/ViBiOh/auth/releases)
- [Commits](ViBiOh/auth@v2.14.10...v2.14.11)

---
updated-dependencies:
- dependency-name: github.com/ViBiOh/auth/v2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Signed-off-by: Vincent Boutour <[email protected]>
  • Loading branch information
dependabot[bot] authored and ViBiOh committed Sep 25, 2022
1 parent 9a48ea8 commit 88c395f
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 45 deletions.
13 changes: 8 additions & 5 deletions cmd/ketchup/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,27 +105,28 @@ func main() {
appServer := server.New(appServerConfig)
promServer := server.New(promServerConfig)
prometheusApp := prometheus.New(prometheusConfig)
prometheusRegisterer := prometheusApp.Registerer()

ketchupDb, err := db.New(dbConfig, tracerApp.GetTracer("database"))
logger.Fatal(err)
defer ketchupDb.Close()

redisApp := redis.New(redisConfig, prometheusApp.Registerer(), tracerApp.GetTracer("redis"))
redisApp := redis.New(redisConfig, prometheusRegisterer, tracerApp.GetTracer("redis"))

healthApp := health.New(healthConfig, ketchupDb.Ping, redisApp.Ping)

authServiceApp, authMiddlewareApp := initAuth(ketchupDb, tracerApp.GetTracer("auth"))

userServiceApp := userService.New(userStore.New(ketchupDb), &authServiceApp)
githubApp := github.New(githubConfig, redisApp, tracerApp)
githubApp := github.New(githubConfig, redisApp, prometheusRegisterer, tracerApp)
dockerApp := docker.New(dockerConfig)
helmApp := helm.New()
npmApp := npm.New()
pypiApp := pypi.New()
repositoryServiceApp := repositoryService.New(repositoryStore.New(ketchupDb), githubApp, helmApp, dockerApp, npmApp, pypiApp)
ketchupServiceApp := ketchupService.New(ketchupStore.New(ketchupDb), repositoryServiceApp)

mailerApp, err := mailer.New(mailerConfig, prometheusApp.Registerer(), tracerApp.GetTracer("mailer"))
mailerApp, err := mailer.New(mailerConfig, prometheusRegisterer, tracerApp.GetTracer("mailer"))
logger.Fatal(err)
defer mailerApp.Close()

Expand Down Expand Up @@ -154,9 +155,11 @@ func main() {
publicHandler.ServeHTTP(w, r)
})

go githubApp.Start(prometheusApp.Registerer(), healthApp.Done())
ctx := healthApp.Context()

go githubApp.Start(ctx)
if schedulerApp != nil {
go schedulerApp.Start(healthApp.Done())
go schedulerApp.Start(ctx)
}

go promServer.Start("prometheus", healthApp.End(), prometheusApp.Handler())
Expand Down
2 changes: 1 addition & 1 deletion cmd/notifier/notifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func main() {
helmApp := helm.New()
npmApp := npm.New()
pypiApp := pypi.New()
repositoryServiceApp := repositoryService.New(repositoryStore.New(ketchupDb), github.New(githubConfig, nil, tracerApp), helmApp, docker.New(dockerConfig), npmApp, pypiApp)
repositoryServiceApp := repositoryService.New(repositoryStore.New(ketchupDb), github.New(githubConfig, nil, nil, tracerApp), helmApp, docker.New(dockerConfig), npmApp, pypiApp)
ketchupServiceApp := ketchupService.New(ketchupStore.New(ketchupDb), repositoryServiceApp)
userServiceApp := userService.New(userStore.New(ketchupDb), nil)

Expand Down
16 changes: 8 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ module github.com/ViBiOh/ketchup
go 1.19

require (
github.com/ViBiOh/auth/v2 v2.14.10
github.com/ViBiOh/auth/v2 v2.14.11
github.com/ViBiOh/flags v1.2.0
github.com/ViBiOh/httputils/v4 v4.47.9
github.com/ViBiOh/mailer v1.30.8
github.com/ViBiOh/httputils/v4 v4.48.0
github.com/ViBiOh/mailer v1.30.9
github.com/golang/mock v1.6.0
github.com/jackc/pgconn v1.13.0
github.com/jackc/pgproto3/v2 v2.3.1
Expand Down Expand Up @@ -38,14 +38,14 @@ require (
github.com/streadway/amqp v1.0.0 // indirect
github.com/tdewolff/minify/v2 v2.12.1 // indirect
github.com/tdewolff/parse/v2 v2.6.3 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 // indirect
go.opentelemetry.io/otel v1.10.0 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.10.0 // indirect
go.opentelemetry.io/otel/metric v0.31.0 // indirect
go.opentelemetry.io/otel/metric v0.32.0 // indirect
go.opentelemetry.io/otel/sdk v1.10.0 // indirect
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect
golang.org/x/sys v0.0.0-20220913175220-63ea55921009 // indirect
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect
golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 // indirect
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect
golang.org/x/term v0.0.0-20220919170432-7a66f970e087 // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/protobuf v1.28.1 // indirect
)
32 changes: 16 additions & 16 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/ViBiOh/auth/v2 v2.14.10 h1:R8S8RRx6dUB8k1daCE4nyrMic5bBBJQLRGvRfeBrCKs=
github.com/ViBiOh/auth/v2 v2.14.10/go.mod h1:sVyWtW3Vw6VbusIMh1JHJ4vMAzZoQ8a/bw8tl/r8Q/I=
github.com/ViBiOh/auth/v2 v2.14.11 h1:Bjh1CvBiTVAts0IbuqrPsRRHuUazNwMxtHDdPI60+UE=
github.com/ViBiOh/auth/v2 v2.14.11/go.mod h1:/gJvnWanGMh9puScqVaY2aOlHHwU/15oDjeZOEMRO48=
github.com/ViBiOh/flags v1.2.0 h1:DaujjNXzD29KxKyp4eZdn7c9+uBN5DokWgDAe7DcUmc=
github.com/ViBiOh/flags v1.2.0/go.mod h1:UyMB5zeD/aId7Xw3x7577ZNU298JmukzOcV8p/H2W1s=
github.com/ViBiOh/httputils/v4 v4.47.9 h1:lEhwUZI0ioFMwzVkuNZyDVu0IrxuOT9adwOUUy1NnEQ=
github.com/ViBiOh/httputils/v4 v4.47.9/go.mod h1:B31MGYvRLxCarxA3onkKE7DLGAlFzvx2gpWjSmbHUK8=
github.com/ViBiOh/mailer v1.30.8 h1:TeT30TmYKNNamfbZLuFYFOSNLBaxDURmsJIuqD2kamE=
github.com/ViBiOh/mailer v1.30.8/go.mod h1:2T46L9IUG+a8rqvYClrWiWJK/HKx3tWYUu2gkP3Jo4g=
github.com/ViBiOh/httputils/v4 v4.48.0 h1:KySMrx2rJTEsJI6SNJDlU2m7zQt16f3Q2BfKEgdLbtU=
github.com/ViBiOh/httputils/v4 v4.48.0/go.mod h1:XcA+8YmzJ7r/VjmtrIDuM1yXdlgpL8SoT7ywmuC87j8=
github.com/ViBiOh/mailer v1.30.9 h1:WJniWcO2e11Qf62fzIoyD1XomxhPF7bLv8uzFpMZ4xI=
github.com/ViBiOh/mailer v1.30.9/go.mod h1:/iYCseR3fB5zT4DBoYs9BMfxU5hKzSmVsrnjltSB32k=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
Expand Down Expand Up @@ -327,14 +327,14 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0 h1:Ajldaqhxqw/gNzQA45IKFWLdG7jZuXX/wBW1d5qvbUI=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 h1:qZ3KzA4qPzLBDtQyPk4ydjlg8zvXbNysnFHaVMKJbVo=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0/go.mod h1:14Oo79mRwusSI02L0EfG3Gp1uF3+1wSL+D4zDysxyqs=
go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4=
go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
go.opentelemetry.io/otel/exporters/jaeger v1.10.0 h1:7W3aVVjEYayu/GOqOVF4mbTvnCuxF1wWu3eRxFGQXvw=
go.opentelemetry.io/otel/exporters/jaeger v1.10.0/go.mod h1:n9IGyx0fgyXXZ/i0foLHNxtET9CzXHzZeKCucvRBFgA=
go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs=
go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A=
go.opentelemetry.io/otel/metric v0.32.0 h1:lh5KMDB8xlMM4kwE38vlZJ3rZeiWrjw3As1vclfC01k=
go.opentelemetry.io/otel/metric v0.32.0/go.mod h1:PVDNTt297p8ehm949jsIzd+Z2bIZJYQQG/uuHTeWFHY=
go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY=
go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E=
Expand Down Expand Up @@ -362,8 +362,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM=
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 h1:WJywXQVIb56P2kAvXeMGTIgQ1ZHQxR60+F9dLsodECc=
golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
Expand Down Expand Up @@ -494,13 +494,13 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220913175220-63ea55921009 h1:PuvuRMeLWqsf/ZdT1UUZz0syhioyv1mzuFZsXs4fvhw=
golang.org/x/sys v0.0.0-20220913175220-63ea55921009/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc=
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc=
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.0.0-20220919170432-7a66f970e087 h1:tPwmk4vmvVCMdr98VgL4JH+qZxPL8fqlUOHnyOM8N3w=
golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down
32 changes: 21 additions & 11 deletions pkg/provider/github/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/ViBiOh/httputils/v4/pkg/cron"
"github.com/ViBiOh/httputils/v4/pkg/httpjson"
"github.com/ViBiOh/httputils/v4/pkg/logger"
httpModel "github.com/ViBiOh/httputils/v4/pkg/model"
"github.com/ViBiOh/httputils/v4/pkg/request"
"github.com/ViBiOh/httputils/v4/pkg/tracer"
"github.com/ViBiOh/ketchup/pkg/model"
Expand Down Expand Up @@ -51,7 +52,7 @@ type RateLimitResponse struct {

// App of package
type App interface {
Start(prometheus.Registerer, <-chan struct{})
Start(context.Context)
LatestVersions(context.Context, string, []string) (map[string]semver.Version, error)
}

Expand All @@ -63,6 +64,7 @@ type Config struct {
type app struct {
tracer trace.Tracer
redisApp redis
metrics prometheus.Gauge
token string
}

Expand All @@ -74,38 +76,46 @@ func Flags(fs *flag.FlagSet, prefix string) Config {
}

// New creates new App from Config
func New(config Config, redisApp redis, tracerApp tracer.App) App {
func New(config Config, redisApp redis, registerer prometheus.Registerer, tracerApp tracer.App) App {
httpClient = tracer.AddTracerToClient(httpClient, tracerApp.GetProvider())

var metrics prometheus.Gauge
if !httpModel.IsNil(registerer) {
metrics := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: "ketchup",
Name: "github_rate_limit_remainings",
})
registerer.MustRegister(metrics)
}

return app{
token: strings.TrimSpace(*config.token),
redisApp: redisApp,
tracer: tracerApp.GetTracer("github"),
metrics: metrics,
}
}

func (a app) newClient() request.Request {
return request.New().Header("Authorization", fmt.Sprintf("token %s", a.token)).WithClient(httpClient)
}

func (a app) Start(registerer prometheus.Registerer, done <-chan struct{}) {
metrics := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: "ketchup",
Name: "github_rate_limit_remainings",
})
registerer.MustRegister(metrics)
func (a app) Start(ctx context.Context) {
if httpModel.IsNil(a.metrics) {
return
}

cron.New().Now().Each(time.Minute).WithTracer(a.tracer).OnError(func(err error) {
logger.Error("get rate limit metrics: %s", err)
}).Exclusive(a.redisApp, "ketchup:github_rate_limit_metrics", 15*time.Second).Start(func(ctx context.Context) error {
}).Exclusive(a.redisApp, "ketchup:github_rate_limit_metrics", 15*time.Second).Start(ctx, func(ctx context.Context) error {
value, err := a.getRateLimit(ctx)
if err != nil {
return err
}

metrics.Set(float64(value))
a.metrics.Set(float64(value))
return nil
}, done)
})
}

func (a app) LatestVersions(ctx context.Context, repository string, patterns []string) (map[string]semver.Version, error) {
Expand Down
8 changes: 4 additions & 4 deletions pkg/scheduler/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (

// App of package
type App interface {
Start(<-chan struct{})
Start(context.Context)
}

// Config of package
Expand Down Expand Up @@ -59,12 +59,12 @@ func New(config Config, notifierApp notifier.App, redisApp redis.App, tracer tra
}
}

func (a app) Start(done <-chan struct{}) {
func (a app) Start(ctx context.Context) {
cron.New().At(a.hour).In(a.timezone).Days().WithTracer(a.tracer).OnError(func(err error) {
logger.Error("error while running ketchup notify: %s", err)
}).OnSignal(syscall.SIGUSR1).Exclusive(a.redisApp, "ketchup:notify", 10*time.Minute).Start(func(ctx context.Context) error {
}).OnSignal(syscall.SIGUSR1).Exclusive(a.redisApp, "ketchup:notify", 10*time.Minute).Start(ctx, func(ctx context.Context) error {
logger.Info("Starting ketchup notifier")
defer logger.Info("Ending ketchup notifier")
return a.notifierApp.Notify(ctx)
}, done)
})
}

0 comments on commit 88c395f

Please sign in to comment.