diff --git a/go.mod b/go.mod index ddd903e67..2e76b26f9 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index dfb65636a..b0f440713 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/manager/config/constant_otel.go b/manager/config/constant_otel.go new file mode 100644 index 000000000..2f1d412ca --- /dev/null +++ b/manager/config/constant_otel.go @@ -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") +) diff --git a/manager/handlers/cdn.go b/manager/handlers/cdn.go index 836cb53ec..fe53a5b17 100644 --- a/manager/handlers/cdn.go +++ b/manager/handlers/cdn.go @@ -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 diff --git a/manager/handlers/cdn_cluster.go b/manager/handlers/cdn_cluster.go index b3f10f57e..34def4c24 100644 --- a/manager/handlers/cdn_cluster.go +++ b/manager/handlers/cdn_cluster.go @@ -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 } diff --git a/manager/handlers/handlers.go b/manager/handlers/handlers.go index a147c8f1a..ff49751ae 100644 --- a/manager/handlers/handlers.go +++ b/manager/handlers/handlers.go @@ -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) { diff --git a/manager/handlers/oauth.go b/manager/handlers/oauth.go index fc788900e..2c6f09780 100644 --- a/manager/handlers/oauth.go +++ b/manager/handlers/oauth.go @@ -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 diff --git a/manager/handlers/permission.go b/manager/handlers/permission.go index 5cd34a220..51e9d68db 100644 --- a/manager/handlers/permission.go +++ b/manager/handlers/permission.go @@ -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)) } } diff --git a/manager/handlers/preheat.go b/manager/handlers/preheat.go index 7fcee8c09..270ed153f 100644 --- a/manager/handlers/preheat.go +++ b/manager/handlers/preheat.go @@ -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 diff --git a/manager/handlers/role.go b/manager/handlers/role.go index fb9e27c49..318da93a3 100644 --- a/manager/handlers/role.go +++ b/manager/handlers/role.go @@ -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 { diff --git a/manager/handlers/scheduler.go b/manager/handlers/scheduler.go index e89a52302..ce3d799a5 100644 --- a/manager/handlers/scheduler.go +++ b/manager/handlers/scheduler.go @@ -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 diff --git a/manager/handlers/scheduler_cluster.go b/manager/handlers/scheduler_cluster.go index 78d413e22..095e63a96 100644 --- a/manager/handlers/scheduler_cluster.go +++ b/manager/handlers/scheduler_cluster.go @@ -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 diff --git a/manager/handlers/security_group.go b/manager/handlers/security_group.go index 70886e24a..2457688ba 100644 --- a/manager/handlers/security_group.go +++ b/manager/handlers/security_group.go @@ -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 diff --git a/manager/handlers/user.go b/manager/handlers/user.go index 900a6c536..5cc405e2e 100644 --- a/manager/handlers/user.go +++ b/manager/handlers/user.go @@ -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 { diff --git a/manager/manager.go b/manager/manager.go index 709680c7b..8a9b93253 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -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{ diff --git a/manager/middlewares/tracer.go b/manager/middlewares/tracer.go new file mode 100644 index 000000000..771b7d90e --- /dev/null +++ b/manager/middlewares/tracer.go @@ -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() + } +} diff --git a/manager/router/router.go b/manager/router/router.go index 9d4ec71b0..6841e9119 100644 --- a/manager/router/router.go +++ b/manager/router/router.go @@ -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