feat: add otel trace (#650)

Signed-off-by: Gaius <gaius.qi@gmail.com>
This commit is contained in:
Gaius 2021-09-14 10:35:36 +08:00
parent d19332e854
commit e3a56c9de9
No known key found for this signature in database
GPG Key ID: 8B4E5D1290FA2FFB
17 changed files with 176 additions and 93 deletions

1
go.mod
View File

@ -60,6 +60,7 @@ require (
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2
github.com/swaggo/gin-swagger v1.3.1
github.com/swaggo/swag v1.7.1
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.20.0
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0
go.opentelemetry.io/otel v0.20.0
go.opentelemetry.io/otel/exporters/trace/jaeger v0.20.0

5
go.sum
View File

@ -198,6 +198,7 @@ github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6
github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/gin-gonic/gin v1.7.1/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA=
github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/go-echarts/go-echarts/v2 v2.2.3 h1:H8oPdUpzuiV2K8S4xYZa1JRNjP3U0h7HVqvhPrmCk1A=
@ -842,8 +843,12 @@ go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok=
go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.20.0 h1:R6rfVN+8Eqzd+E5L/i8rWpgZeWen/m6y4hSgn3avdf8=
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.20.0/go.mod h1:npLhGl0PxPw3jya83ffJ/CfZ8BPwyKUHHZsbgTdpvCs=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 h1:sO4WKdPAudZGKPcpZT4MJn6JaDmpyLrMPDGGyA1SttE=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
go.opentelemetry.io/contrib/propagators v0.20.0 h1:IrLQng5Z7AfzkS4sEsYaj2ejkO4FCkgKdAr1aYKOfNc=
go.opentelemetry.io/contrib/propagators v0.20.0/go.mod h1:yLmt93MeSiARUwrK57bOZ4FBruRN4taLiW1lcGfnOes=
go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
go.opentelemetry.io/otel v0.15.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA=
go.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s=

View File

@ -0,0 +1,23 @@
/*
* Copyright 2020 The Dragonfly Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package config
import "go.opentelemetry.io/otel/attribute"
const (
AttributeID = attribute.Key("d7y.manager.id")
)

View File

@ -41,7 +41,7 @@ func (h *Handlers) CreateCDN(ctx *gin.Context) {
return
}
cdn, err := h.Service.CreateCDN(json)
cdn, err := h.service.CreateCDN(json)
if err != nil {
ctx.Error(err)
return
@ -68,7 +68,7 @@ func (h *Handlers) DestroyCDN(ctx *gin.Context) {
return
}
if err := h.Service.DestroyCDN(params.ID); err != nil {
if err := h.service.DestroyCDN(params.ID); err != nil {
ctx.Error(err)
return
}
@ -101,7 +101,7 @@ func (h *Handlers) UpdateCDN(ctx *gin.Context) {
return
}
cdn, err := h.Service.UpdateCDN(params.ID, json)
cdn, err := h.service.UpdateCDN(params.ID, json)
if err != nil {
ctx.Error(err)
return
@ -128,7 +128,7 @@ func (h *Handlers) GetCDN(ctx *gin.Context) {
return
}
cdn, err := h.Service.GetCDN(params.ID)
cdn, err := h.service.GetCDN(params.ID)
if err != nil {
ctx.Error(err)
return
@ -157,13 +157,13 @@ func (h *Handlers) GetCDNs(ctx *gin.Context) {
}
h.setPaginationDefault(&query.Page, &query.PerPage)
cdns, err := h.Service.GetCDNs(query)
cdns, err := h.service.GetCDNs(query)
if err != nil {
ctx.Error(err)
return
}
totalCount, err := h.Service.CDNTotalCount(query)
totalCount, err := h.service.CDNTotalCount(query)
if err != nil {
ctx.Error(err)
return

View File

@ -42,7 +42,7 @@ func (h *Handlers) CreateCDNCluster(ctx *gin.Context) {
}
if json.SecurityGroupDomain != "" {
cdn, err := h.Service.CreateCDNClusterWithSecurityGroupDomain(json)
cdn, err := h.service.CreateCDNClusterWithSecurityGroupDomain(json)
if err != nil {
ctx.Error(err)
return
@ -52,7 +52,7 @@ func (h *Handlers) CreateCDNCluster(ctx *gin.Context) {
return
}
cdnCluster, err := h.Service.CreateCDNCluster(json)
cdnCluster, err := h.service.CreateCDNCluster(json)
if err != nil {
ctx.Error(err)
return
@ -79,7 +79,7 @@ func (h *Handlers) DestroyCDNCluster(ctx *gin.Context) {
return
}
if err := h.Service.DestroyCDNCluster(params.ID); err != nil {
if err := h.service.DestroyCDNCluster(params.ID); err != nil {
ctx.Error(err)
return
}
@ -113,7 +113,7 @@ func (h *Handlers) UpdateCDNCluster(ctx *gin.Context) {
}
if json.SecurityGroupDomain != "" {
cdn, err := h.Service.UpdateCDNClusterWithSecurityGroupDomain(params.ID, json)
cdn, err := h.service.UpdateCDNClusterWithSecurityGroupDomain(params.ID, json)
if err != nil {
ctx.Error(err)
return
@ -123,7 +123,7 @@ func (h *Handlers) UpdateCDNCluster(ctx *gin.Context) {
return
}
cdnCluster, err := h.Service.UpdateCDNCluster(params.ID, json)
cdnCluster, err := h.service.UpdateCDNCluster(params.ID, json)
if err != nil {
ctx.Error(err)
return
@ -150,7 +150,7 @@ func (h *Handlers) GetCDNCluster(ctx *gin.Context) {
return
}
cdnCluster, err := h.Service.GetCDNCluster(params.ID)
cdnCluster, err := h.service.GetCDNCluster(params.ID)
if err != nil {
ctx.Error(err)
return
@ -179,13 +179,13 @@ func (h *Handlers) GetCDNClusters(ctx *gin.Context) {
}
h.setPaginationDefault(&query.Page, &query.PerPage)
cdns, err := h.Service.GetCDNClusters(query)
cdns, err := h.service.GetCDNClusters(query)
if err != nil {
ctx.Error(err)
return
}
totalCount, err := h.Service.CDNClusterTotalCount(query)
totalCount, err := h.service.CDNClusterTotalCount(query)
if err != nil {
ctx.Error(err)
return
@ -214,7 +214,7 @@ func (h *Handlers) AddCDNToCDNCluster(ctx *gin.Context) {
return
}
if err := h.Service.AddCDNToCDNCluster(params.ID, params.CDNID); err != nil {
if err := h.service.AddCDNToCDNCluster(params.ID, params.CDNID); err != nil {
ctx.Error(err)
return
}
@ -241,7 +241,7 @@ func (h *Handlers) AddSchedulerClusterToCDNCluster(ctx *gin.Context) {
return
}
if err := h.Service.AddSchedulerClusterToCDNCluster(params.ID, params.SchedulerClusterID); err != nil {
if err := h.service.AddSchedulerClusterToCDNCluster(params.ID, params.SchedulerClusterID); err != nil {
ctx.Error(err)
return
}

View File

@ -26,11 +26,13 @@ import (
)
type Handlers struct {
Service service.REST
service service.REST
}
func New(service service.REST) *Handlers {
return &Handlers{Service: service}
return &Handlers{
service: service,
}
}
func (h *Handlers) setPaginationDefault(page, perPage *int) {

View File

@ -41,7 +41,7 @@ func (h *Handlers) CreateOauth(ctx *gin.Context) {
return
}
oauth, err := h.Service.CreateOauth(json)
oauth, err := h.service.CreateOauth(json)
if err != nil {
ctx.Error(err)
return
@ -68,7 +68,7 @@ func (h *Handlers) DestroyOauth(ctx *gin.Context) {
return
}
if err := h.Service.DestroyOauth(params.ID); err != nil {
if err := h.service.DestroyOauth(params.ID); err != nil {
ctx.Error(err)
return
}
@ -101,7 +101,7 @@ func (h *Handlers) UpdateOauth(ctx *gin.Context) {
return
}
oauth, err := h.Service.UpdateOauth(params.ID, json)
oauth, err := h.service.UpdateOauth(params.ID, json)
if err != nil {
ctx.Error(err)
return
@ -128,7 +128,7 @@ func (h *Handlers) GetOauth(ctx *gin.Context) {
return
}
oauth, err := h.Service.GetOauth(params.ID)
oauth, err := h.service.GetOauth(params.ID)
if err != nil {
ctx.Error(err)
return
@ -157,13 +157,13 @@ func (h *Handlers) GetOauths(ctx *gin.Context) {
}
h.setPaginationDefault(&query.Page, &query.PerPage)
oauth, err := h.Service.GetOauths(query)
oauth, err := h.service.GetOauths(query)
if err != nil {
ctx.Error(err)
return
}
totalCount, err := h.Service.OauthTotalCount(query)
totalCount, err := h.service.OauthTotalCount(query)
if err != nil {
ctx.Error(err)
return

View File

@ -32,6 +32,6 @@ import (
// @Router /permissions [get]
func (h *Handlers) GetPermissions(g *gin.Engine) func(ctx *gin.Context) {
return func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, h.Service.GetPermissions(g))
ctx.JSON(http.StatusOK, h.service.GetPermissions(g))
}
}

View File

@ -41,7 +41,7 @@ func (h *Handlers) CreatePreheat(ctx *gin.Context) {
return
}
preheat, err := h.Service.CreatePreheat(json)
preheat, err := h.service.CreatePreheat(json)
if err != nil {
ctx.Error(err)
return
@ -68,7 +68,7 @@ func (h *Handlers) GetPreheat(ctx *gin.Context) {
return
}
preheat, err := h.Service.GetPreheat(params.ID)
preheat, err := h.service.GetPreheat(params.ID)
if err != nil {
ctx.Error(err)
return

View File

@ -40,7 +40,7 @@ func (h *Handlers) CreateRole(ctx *gin.Context) {
return
}
if err := h.Service.CreateRole(json); err != nil {
if err := h.service.CreateRole(json); err != nil {
ctx.Error(err)
return
}
@ -65,7 +65,7 @@ func (h *Handlers) DestroyRole(ctx *gin.Context) {
return
}
if ok, err := h.Service.DestroyRole(params.Role); err != nil {
if ok, err := h.service.DestroyRole(params.Role); err != nil {
ctx.Error(err)
return
} else if !ok {
@ -93,7 +93,7 @@ func (h *Handlers) GetRole(ctx *gin.Context) {
return
}
ctx.JSON(http.StatusOK, h.Service.GetRole(params.Role))
ctx.JSON(http.StatusOK, h.service.GetRole(params.Role))
}
// @Summary Get Roles
@ -106,7 +106,7 @@ func (h *Handlers) GetRole(ctx *gin.Context) {
// @Failure 500
// @Router /roles [get]
func (h *Handlers) GetRoles(ctx *gin.Context) {
roles := h.Service.GetRoles()
roles := h.service.GetRoles()
ctx.JSON(http.StatusOK, roles)
}
@ -134,7 +134,7 @@ func (h *Handlers) AddPermissionForRole(ctx *gin.Context) {
return
}
if ok, err := h.Service.AddPermissionForRole(params.Role, json); err != nil {
if ok, err := h.service.AddPermissionForRole(params.Role, json); err != nil {
ctx.Error(err)
return
} else if !ok {
@ -169,7 +169,7 @@ func (h *Handlers) DeletePermissionForRole(ctx *gin.Context) {
return
}
if ok, err := h.Service.DeletePermissionForRole(params.Role, json); err != nil {
if ok, err := h.service.DeletePermissionForRole(params.Role, json); err != nil {
ctx.Error(err)
return
} else if !ok {

View File

@ -41,7 +41,7 @@ func (h *Handlers) CreateScheduler(ctx *gin.Context) {
return
}
scheduler, err := h.Service.CreateScheduler(json)
scheduler, err := h.service.CreateScheduler(json)
if err != nil {
ctx.Error(err)
return
@ -68,7 +68,7 @@ func (h *Handlers) DestroyScheduler(ctx *gin.Context) {
return
}
if err := h.Service.DestroyScheduler(params.ID); err != nil {
if err := h.service.DestroyScheduler(params.ID); err != nil {
ctx.Error(err)
return
}
@ -101,7 +101,7 @@ func (h *Handlers) UpdateScheduler(ctx *gin.Context) {
return
}
scheduler, err := h.Service.UpdateScheduler(params.ID, json)
scheduler, err := h.service.UpdateScheduler(params.ID, json)
if err != nil {
ctx.Error(err)
return
@ -128,7 +128,7 @@ func (h *Handlers) GetScheduler(ctx *gin.Context) {
return
}
scheduler, err := h.Service.GetScheduler(params.ID)
scheduler, err := h.service.GetScheduler(params.ID)
if err != nil {
ctx.Error(err)
return
@ -157,13 +157,13 @@ func (h *Handlers) GetSchedulers(ctx *gin.Context) {
}
h.setPaginationDefault(&query.Page, &query.PerPage)
schedulers, err := h.Service.GetSchedulers(query)
schedulers, err := h.service.GetSchedulers(query)
if err != nil {
ctx.Error(err)
return
}
totalCount, err := h.Service.SchedulerTotalCount(query)
totalCount, err := h.service.SchedulerTotalCount(query)
if err != nil {
ctx.Error(err)
return

View File

@ -42,7 +42,7 @@ func (h *Handlers) CreateSchedulerCluster(ctx *gin.Context) {
}
if json.SecurityGroupDomain != "" {
scheduler, err := h.Service.CreateSchedulerClusterWithSecurityGroupDomain(json)
scheduler, err := h.service.CreateSchedulerClusterWithSecurityGroupDomain(json)
if err != nil {
ctx.Error(err)
return
@ -52,7 +52,7 @@ func (h *Handlers) CreateSchedulerCluster(ctx *gin.Context) {
return
}
schedulerCluster, err := h.Service.CreateSchedulerCluster(json)
schedulerCluster, err := h.service.CreateSchedulerCluster(json)
if err != nil {
ctx.Error(err)
return
@ -79,7 +79,7 @@ func (h *Handlers) DestroySchedulerCluster(ctx *gin.Context) {
return
}
if err := h.Service.DestroySchedulerCluster(params.ID); err != nil {
if err := h.service.DestroySchedulerCluster(params.ID); err != nil {
ctx.Error(err)
return
}
@ -113,7 +113,7 @@ func (h *Handlers) UpdateSchedulerCluster(ctx *gin.Context) {
}
if json.SecurityGroupDomain != "" {
scheduler, err := h.Service.UpdateSchedulerClusterWithSecurityGroupDomain(params.ID, json)
scheduler, err := h.service.UpdateSchedulerClusterWithSecurityGroupDomain(params.ID, json)
if err != nil {
ctx.Error(err)
return
@ -123,7 +123,7 @@ func (h *Handlers) UpdateSchedulerCluster(ctx *gin.Context) {
return
}
schedulerCluster, err := h.Service.UpdateSchedulerCluster(params.ID, json)
schedulerCluster, err := h.service.UpdateSchedulerCluster(params.ID, json)
if err != nil {
ctx.Error(err)
return
@ -150,7 +150,7 @@ func (h *Handlers) GetSchedulerCluster(ctx *gin.Context) {
return
}
schedulerCluster, err := h.Service.GetSchedulerCluster(params.ID)
schedulerCluster, err := h.service.GetSchedulerCluster(params.ID)
if err != nil {
ctx.Error(err)
return
@ -179,13 +179,13 @@ func (h *Handlers) GetSchedulerClusters(ctx *gin.Context) {
}
h.setPaginationDefault(&query.Page, &query.PerPage)
schedulerClusters, err := h.Service.GetSchedulerClusters(query)
schedulerClusters, err := h.service.GetSchedulerClusters(query)
if err != nil {
ctx.Error(err)
return
}
totalCount, err := h.Service.SchedulerClusterTotalCount(query)
totalCount, err := h.service.SchedulerClusterTotalCount(query)
if err != nil {
ctx.Error(err)
return
@ -214,7 +214,7 @@ func (h *Handlers) AddSchedulerToSchedulerCluster(ctx *gin.Context) {
return
}
err := h.Service.AddSchedulerToSchedulerCluster(params.ID, params.SchedulerID)
err := h.service.AddSchedulerToSchedulerCluster(params.ID, params.SchedulerID)
if err != nil {
ctx.Error(err)
return

View File

@ -41,7 +41,7 @@ func (h *Handlers) CreateSecurityGroup(ctx *gin.Context) {
return
}
securityGroup, err := h.Service.CreateSecurityGroup(json)
securityGroup, err := h.service.CreateSecurityGroup(json)
if err != nil {
ctx.Error(err)
return
@ -68,7 +68,7 @@ func (h *Handlers) DestroySecurityGroup(ctx *gin.Context) {
return
}
if err := h.Service.DestroySecurityGroup(params.ID); err != nil {
if err := h.service.DestroySecurityGroup(params.ID); err != nil {
ctx.Error(err)
return
}
@ -101,7 +101,7 @@ func (h *Handlers) UpdateSecurityGroup(ctx *gin.Context) {
return
}
securityGroup, err := h.Service.UpdateSecurityGroup(params.ID, json)
securityGroup, err := h.service.UpdateSecurityGroup(params.ID, json)
if err != nil {
ctx.Error(err)
return
@ -128,7 +128,7 @@ func (h *Handlers) GetSecurityGroup(ctx *gin.Context) {
return
}
securityGroup, err := h.Service.GetSecurityGroup(params.ID)
securityGroup, err := h.service.GetSecurityGroup(params.ID)
if err != nil {
ctx.Error(err)
return
@ -157,13 +157,13 @@ func (h *Handlers) GetSecurityGroups(ctx *gin.Context) {
}
h.setPaginationDefault(&query.Page, &query.PerPage)
securityGroups, err := h.Service.GetSecurityGroups(query)
securityGroups, err := h.service.GetSecurityGroups(query)
if err != nil {
ctx.Error(err)
return
}
totalCount, err := h.Service.SecurityGroupTotalCount(query)
totalCount, err := h.service.SecurityGroupTotalCount(query)
if err != nil {
ctx.Error(err)
return
@ -192,7 +192,7 @@ func (h *Handlers) AddSchedulerClusterToSecurityGroup(ctx *gin.Context) {
return
}
err := h.Service.AddSchedulerClusterToSecurityGroup(params.ID, params.SchedulerClusterID)
err := h.service.AddSchedulerClusterToSecurityGroup(params.ID, params.SchedulerClusterID)
if err != nil {
ctx.Error(err)
return
@ -220,7 +220,7 @@ func (h *Handlers) AddCDNClusterToSecurityGroup(ctx *gin.Context) {
return
}
err := h.Service.AddCDNClusterToSecurityGroup(params.ID, params.CDNClusterID)
err := h.service.AddCDNClusterToSecurityGroup(params.ID, params.CDNClusterID)
if err != nil {
ctx.Error(err)
return

View File

@ -42,7 +42,7 @@ func (h *Handlers) GetUser(ctx *gin.Context) {
return
}
user, err := h.Service.GetUser(params.ID)
user, err := h.service.GetUser(params.ID)
if err != nil {
ctx.Error(err)
return
@ -68,7 +68,7 @@ func (h *Handlers) SignUp(ctx *gin.Context) {
return
}
user, err := h.Service.SignUp(json)
user, err := h.service.SignUp(json)
if err != nil {
ctx.Error(err)
return
@ -100,7 +100,7 @@ func (h *Handlers) ResetPassword(ctx *gin.Context) {
return
}
if err := h.Service.ResetPassword(params.ID, json); err != nil {
if err := h.service.ResetPassword(params.ID, json); err != nil {
ctx.Error(err)
return
}
@ -126,7 +126,7 @@ func (h *Handlers) OauthSignin(ctx *gin.Context) {
return
}
authURL, err := h.Service.OauthSignin(params.Name)
authURL, err := h.service.OauthSignin(params.Name)
if err != nil {
ctx.Error(err)
return
@ -159,7 +159,7 @@ func (h *Handlers) OauthSigninCallback(j *jwt.GinJWTMiddleware) func(*gin.Contex
return
}
user, err := h.Service.OauthSigninCallback(params.Name, query.Code)
user, err := h.service.OauthSigninCallback(params.Name, query.Code)
if err != nil {
ctx.Error(err)
return
@ -186,7 +186,7 @@ func (h *Handlers) GetRolesForUser(ctx *gin.Context) {
return
}
roles, err := h.Service.GetRolesForUser(params.ID)
roles, err := h.service.GetRolesForUser(params.ID)
if err != nil {
ctx.Error(err)
return
@ -213,7 +213,7 @@ func (h *Handlers) AddRoleToUser(ctx *gin.Context) {
return
}
if ok, err := h.Service.AddRoleForUser(params); err != nil {
if ok, err := h.service.AddRoleForUser(params); err != nil {
ctx.Error(err)
return
} else if !ok {
@ -242,7 +242,7 @@ func (h *Handlers) DeleteRoleForUser(ctx *gin.Context) {
return
}
if ok, err := h.Service.DeleteRoleForUser(params); err != nil {
if ok, err := h.service.DeleteRoleForUser(params); err != nil {
ctx.Error(err)
return
} else if !ok {

View File

@ -33,6 +33,7 @@ import (
"d7y.io/dragonfly/v2/manager/service"
"d7y.io/dragonfly/v2/pkg/rpc"
"d7y.io/dragonfly/v2/pkg/rpc/manager"
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
"google.golang.org/grpc"
)
@ -87,7 +88,7 @@ func New(cfg *config.Config) (*Server, error) {
// Initialize REST server
restService := service.NewREST(db, cache, job, enforcer)
router, err := router.Init(cfg.Console, cfg.Verbose, cfg.Server.PublicPath, restService, enforcer)
router, err := router.Init(cfg, restService, enforcer)
if err != nil {
return nil, err
}
@ -104,7 +105,12 @@ func New(cfg *config.Config) (*Server, error) {
// Initialize GRPC server
grpcService := service.NewGRPC(db, cache, searcher)
grpcServer := grpc.NewServer()
var opts []grpc.ServerOption
if cfg.Options.Telemetry.Jaeger != "" {
opts = append(opts, grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()), grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor()))
}
grpcServer := grpc.NewServer(opts...)
manager.RegisterManagerServer(grpcServer, grpcService)
return &Server{

View File

@ -0,0 +1,37 @@
/*
* Copyright 2020 The Dragonfly Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package middlewares
import (
"d7y.io/dragonfly/v2/manager/config"
"github.com/gin-gonic/gin"
"go.opentelemetry.io/otel"
)
const (
TracerName = "dragonfly-manager-rest"
)
func Tracer() gin.HandlerFunc {
return func(c *gin.Context) {
tracer := otel.Tracer(TracerName)
_, span := tracer.Start(c.Request.Context(), c.HandlerName())
span.SetAttributes(config.AttributeID.Float64(c.GetFloat64("id")))
defer span.End()
c.Next()
}
}

View File

@ -22,6 +22,7 @@ import (
"path/filepath"
"d7y.io/dragonfly/v2/internal/dfpath"
"d7y.io/dragonfly/v2/manager/config"
"d7y.io/dragonfly/v2/manager/handlers"
"d7y.io/dragonfly/v2/manager/middlewares"
"d7y.io/dragonfly/v2/manager/service"
@ -32,20 +33,23 @@ import (
ginprometheus "github.com/mcuadros/go-gin-prometheus"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
)
const (
GinLogFileName = "gin.log"
GinLogFileName = "gin.log"
PrometheusSubsystemName = "dragonfly_manager"
OtelServiceName = "dragonfly-manager"
)
func Init(console bool, verbose bool, publicPath string, service service.REST, enforcer *casbin.Enforcer) (*gin.Engine, error) {
func Init(cfg *config.Config, service service.REST, enforcer *casbin.Enforcer) (*gin.Engine, error) {
// Set mode
if !verbose {
if !cfg.Verbose {
gin.SetMode(gin.ReleaseMode)
}
// Logging to a file
if !console {
if !cfg.Console {
gin.DisableConsoleColor()
logDir := filepath.Join(dfpath.LogDir, "manager")
f, _ := os.Create(filepath.Join(logDir, GinLogFileName))
@ -56,9 +60,14 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
h := handlers.New(service)
// Prometheus
p := ginprometheus.NewPrometheus("dragonfly_manager")
p := ginprometheus.NewPrometheus(PrometheusSubsystemName)
p.Use(r)
// Opentelemetry
if cfg.Options.Telemetry.Jaeger != "" {
r.Use(otelgin.Middleware(OtelServiceName))
}
// CORS
corsConfig := cors.DefaultConfig()
corsConfig.AllowAllOrigins = true
@ -76,27 +85,27 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
}
// Manager View
r.Use(static.Serve("/", static.LocalFile(publicPath, true)))
r.Use(static.Serve("/", static.LocalFile(cfg.Server.PublicPath, true)))
// Router
apiv1 := r.Group("/api/v1")
// User
u := apiv1.Group("/users")
u.GET("/:id", jwt.MiddlewareFunc(), rbac, h.GetUser)
u.POST("/signin", jwt.LoginHandler)
u.POST("/signout", jwt.LogoutHandler)
u.POST("/signup", h.SignUp)
u.GET("/signin/:name", h.OauthSignin)
u.GET("/signin/:name/callback", h.OauthSigninCallback(jwt))
u.POST("/refresh_token", jwt.RefreshHandler)
u.POST("/:id/reset_password", h.ResetPassword)
u.GET("/:id/roles", jwt.MiddlewareFunc(), rbac, h.GetRolesForUser)
u.PUT("/:id/roles/:role", jwt.MiddlewareFunc(), rbac, h.AddRoleToUser)
u.DELETE("/:id/roles/:role", jwt.MiddlewareFunc(), rbac, h.DeleteRoleForUser)
u.GET("/:id", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, h.GetUser)
u.POST("/signin", middlewares.Tracer(), jwt.LoginHandler)
u.POST("/signout", middlewares.Tracer(), jwt.LogoutHandler)
u.POST("/signup", middlewares.Tracer(), h.SignUp)
u.GET("/signin/:name", middlewares.Tracer(), h.OauthSignin)
u.GET("/signin/:name/callback", middlewares.Tracer(), h.OauthSigninCallback(jwt))
u.POST("/refresh_token", middlewares.Tracer(), jwt.RefreshHandler)
u.POST("/:id/reset_password", middlewares.Tracer(), h.ResetPassword)
u.GET("/:id/roles", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, h.GetRolesForUser)
u.PUT("/:id/roles/:role", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, h.AddRoleToUser)
u.DELETE("/:id/roles/:role", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, h.DeleteRoleForUser)
// Role
re := apiv1.Group("/roles", jwt.MiddlewareFunc(), rbac)
re := apiv1.Group("/roles", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
re.POST("", h.CreateRole)
re.DELETE("/:role", h.DestroyRole)
re.GET("/:role", h.GetRole)
@ -105,11 +114,11 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
re.DELETE("/:role/permissions", h.DeletePermissionForRole)
// Permission
pm := apiv1.Group("/permissions", jwt.MiddlewareFunc(), rbac)
pm := apiv1.Group("/permissions", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
pm.GET("", h.GetPermissions(r))
// Oauth
oa := apiv1.Group("/oauth", jwt.MiddlewareFunc(), rbac)
oa := apiv1.Group("/oauth", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
oa.POST("", h.CreateOauth)
oa.DELETE(":id", h.DestroyOauth)
oa.PATCH(":id", h.UpdateOauth)
@ -117,7 +126,7 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
oa.GET("", h.GetOauths)
// Scheduler Cluster
sc := apiv1.Group("/scheduler-clusters", jwt.MiddlewareFunc(), rbac)
sc := apiv1.Group("/scheduler-clusters", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, middlewares.Tracer())
sc.POST("", h.CreateSchedulerCluster)
sc.DELETE(":id", h.DestroySchedulerCluster)
sc.PATCH(":id", h.UpdateSchedulerCluster)
@ -126,7 +135,7 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
sc.PUT(":id/schedulers/:scheduler_id", h.AddSchedulerToSchedulerCluster)
// Scheduler
s := apiv1.Group("/schedulers", jwt.MiddlewareFunc(), rbac)
s := apiv1.Group("/schedulers", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
s.POST("", h.CreateScheduler)
s.DELETE(":id", h.DestroyScheduler)
s.PATCH(":id", h.UpdateScheduler)
@ -134,7 +143,7 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
s.GET("", h.GetSchedulers)
// CDN Cluster
cc := apiv1.Group("/cdn-clusters", jwt.MiddlewareFunc(), rbac)
cc := apiv1.Group("/cdn-clusters", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
cc.POST("", h.CreateCDNCluster)
cc.DELETE(":id", h.DestroyCDNCluster)
cc.PATCH(":id", h.UpdateCDNCluster)
@ -144,7 +153,7 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
cc.PUT(":id/scheduler-clusters/:scheduler_cluster_id", h.AddSchedulerClusterToCDNCluster)
// CDN
c := apiv1.Group("/cdns", jwt.MiddlewareFunc(), rbac)
c := apiv1.Group("/cdns", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
c.POST("", h.CreateCDN)
c.DELETE(":id", h.DestroyCDN)
c.PATCH(":id", h.UpdateCDN)
@ -152,7 +161,7 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
c.GET("", h.GetCDNs)
// Security Group
sg := apiv1.Group("/security-groups", jwt.MiddlewareFunc(), rbac)
sg := apiv1.Group("/security-groups", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
sg.POST("", h.CreateSecurityGroup)
sg.DELETE(":id", h.DestroySecurityGroup)
sg.PATCH(":id", h.UpdateSecurityGroup)
@ -162,7 +171,7 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
sg.PUT(":id/cdn-clusters/:cdn_cluster_id", h.AddCDNClusterToSecurityGroup)
// Preheat
ph := apiv1.Group("/preheats")
ph := apiv1.Group("/preheats", middlewares.Tracer())
ph.POST("", h.CreatePreheat)
ph.GET(":id", h.GetPreheat)
@ -175,7 +184,7 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
// Fallback To Manager View
r.NoRoute(func(c *gin.Context) {
c.File(filepath.Join(publicPath, "index.html"))
c.File(filepath.Join(cfg.Server.PublicPath, "index.html"))
})
return r, nil