feat: added middlewares

Signed-off-by: Mateusz Urbanek <mateusz.urbanek.98@gmail.com>
This commit is contained in:
Mateusz Urbanek 2024-05-19 09:54:04 +02:00
parent 111c5dfaed
commit 180a131f3b
No known key found for this signature in database
GPG key ID: 965531459857EDA0
11 changed files with 59 additions and 9 deletions

View file

@ -29,6 +29,7 @@ import (
backend "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc/proto"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc/traced"
)
// Set grpc version on compile time to compare against server version response.
@ -44,7 +45,7 @@ func NewGrpcClient(conn *grpc.ClientConn) rpc.Peer {
client := new(client)
client.client = proto.NewWoodpeckerClient(conn)
client.conn = conn
return client
return traced.NewPeerWithTracing(client, "grpc-peer")
}
func (c *client) Close() error {

View file

@ -31,6 +31,7 @@ import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/urfave/cli/v2"
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
"golang.org/x/sync/errgroup"
"google.golang.org/grpc"
"google.golang.org/grpc/keepalive"
@ -117,6 +118,7 @@ func run(c *cli.Context) error {
authorizer := woodpeckerGrpcServer.NewAuthorizer(jwtManager)
grpcServer := grpc.NewServer(
grpc.StatsHandler(otelgrpc.NewServerHandler()),
grpc.StreamInterceptor(authorizer.StreamInterceptor),
grpc.UnaryInterceptor(authorizer.UnaryInterceptor),
grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{

View file

@ -29,7 +29,9 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server"
"go.woodpecker-ci.org/woodpecker/v2/server/cache"
tracedcache "go.woodpecker-ci.org/woodpecker/v2/server/cache/traced"
"go.woodpecker-ci.org/woodpecker/v2/server/queue"
tracedqueue "go.woodpecker-ci.org/woodpecker/v2/server/queue/traced"
"go.woodpecker-ci.org/woodpecker/v2/server/store"
"go.woodpecker-ci.org/woodpecker/v2/server/store/datastore"
)
@ -88,11 +90,17 @@ func checkSqliteFileExist(path string) error {
}
func setupQueue(c *cli.Context, s store.Store) queue.Queue {
return queue.WithTaskStore(queue.New(c.Context), s)
return tracedqueue.NewQueueWithTracing(
queue.WithTaskStore(queue.New(c.Context), s),
"server-queue",
)
}
func setupMembershipService(_ *cli.Context, _store store.Store) cache.MembershipService {
return cache.NewMembershipService(_store)
return tracedcache.NewMembershipServiceWithTracing(
cache.NewMembershipService(_store),
"server-membership-service",
)
}
func setupMetrics(g *errgroup.Group, _store store.Store) {

View file

@ -19,9 +19,19 @@ import (
"fmt"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types/traced"
)
func FindBackend(ctx context.Context, backends []types.Backend, backendName string) (types.Backend, error) {
b, err := findBackend(ctx, backends, backendName)
if err != nil {
return b, err
}
return traced.NewBackendWithTracing(b, backendName), nil
}
func findBackend(ctx context.Context, backends []types.Backend, backendName string) (types.Backend, error) {
if backendName == "auto-detect" {
for _, engine := range backends {
if engine.IsAvailable(ctx) {

View file

@ -23,6 +23,7 @@ import (
"net/http"
"net/url"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"golang.org/x/oauth2"
"golang.org/x/oauth2/bitbucket"
@ -63,6 +64,8 @@ type Client struct {
}
func NewClient(ctx context.Context, url string, client *http.Client) *Client {
client.Transport = otelhttp.NewTransport(client.Transport)
return &Client{
Client: client,
base: url,

View file

@ -21,6 +21,7 @@ import (
"net/http"
"strings"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"golang.org/x/oauth2"
)
@ -34,8 +35,11 @@ type Client struct {
}
func NewClientWithToken(ctx context.Context, ts oauth2.TokenSource, url string) *Client {
client := oauth2.NewClient(ctx, ts)
client.Transport = otelhttp.NewTransport(client.Transport)
return &Client{
client: oauth2.NewClient(ctx, ts),
client: client,
base: url,
}
}

View file

@ -30,6 +30,7 @@ import (
"code.gitea.io/sdk/gitea"
"github.com/rs/zerolog/log"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"golang.org/x/oauth2"
"go.woodpecker-ci.org/woodpecker/v2/server"
@ -591,6 +592,7 @@ func (c *Gitea) newClientToken(ctx context.Context, token string) (*gitea.Client
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
}
httpClient.Transport = otelhttp.NewTransport(httpClient.Transport)
client, err := gitea.NewClient(c.url, gitea.SetToken(token), gitea.SetHTTPClient(httpClient), gitea.SetContext(ctx))
if err != nil &&
(errors.Is(err, &gitea.ErrUnknownVersion{}) || strings.Contains(err.Error(), "Malformed version")) {

View file

@ -28,6 +28,7 @@ import (
"github.com/google/go-github/v61/github"
"github.com/rs/zerolog/log"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"golang.org/x/oauth2"
"go.woodpecker-ci.org/woodpecker/v2/server"
@ -400,12 +401,12 @@ func (c *client) newContext(ctx context.Context) context.Context {
return ctx
}
return context.WithValue(ctx, oauth2.HTTPClient, &http.Client{
Transport: &http.Transport{
Transport: otelhttp.NewTransport(&http.Transport{
Proxy: http.ProxyFromEnvironment,
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
},
}),
})
}

View file

@ -20,6 +20,7 @@ import (
"net/http"
"github.com/xanzy/go-gitlab"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)
const (
@ -30,10 +31,10 @@ const (
// client using the provided OAuth token.
func newClient(url, accessToken string, skipVerify bool) (*gitlab.Client, error) {
return gitlab.NewOAuthClient(accessToken, gitlab.WithBaseURL(url), gitlab.WithHTTPClient(&http.Client{
Transport: &http.Transport{
Transport: otelhttp.NewTransport(&http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: skipVerify},
Proxy: http.ProxyFromEnvironment,
},
}),
}))
}

View file

@ -14,10 +14,24 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server/forge/gitea"
"go.woodpecker-ci.org/woodpecker/v2/server/forge/github"
"go.woodpecker-ci.org/woodpecker/v2/server/forge/gitlab"
"go.woodpecker-ci.org/woodpecker/v2/server/forge/traced"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
func Forge(forge *model.Forge) (forge.Forge, error) {
func Forge(_forge *model.Forge) (forge.Forge, error) {
f, err := new(_forge)
if err != nil {
return f, err
}
if fr, ok := f.(traced.ForgeRefresher); ok {
return traced.NewForgeRefresherWithTracing(fr, string(_forge.Type)), nil
}
return traced.NewForgeWithTracing(f, string(_forge.Type)), nil
}
func new(forge *model.Forge) (forge.Forge, error) {
switch forge.Type {
case model.ForgeTypeAddon:
return setupAddon(forge)

View file

@ -26,6 +26,7 @@ import (
"github.com/gin-gonic/gin"
"github.com/rs/zerolog/log"
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
"go.woodpecker-ci.org/woodpecker/v2/server"
"go.woodpecker-ci.org/woodpecker/v2/web"
@ -45,6 +46,9 @@ func (f *prefixFS) Open(name string) (http.File, error) {
// New returns a gin engine to serve the web frontend.
func New() (*gin.Engine, error) {
e := gin.New()
e.Use(otelgin.Middleware("woodpecker"))
var err error
indexHTML, err = parseIndex()
if err != nil {