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/files v0.0.0-20210815190702-a29dd2bc99b2
github.com/swaggo/gin-swagger v1.3.1 github.com/swaggo/gin-swagger v1.3.1
github.com/swaggo/swag v1.7.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/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0
go.opentelemetry.io/otel v0.20.0 go.opentelemetry.io/otel v0.20.0
go.opentelemetry.io/otel/exporters/trace/jaeger 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.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.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.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 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA=
github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= 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= 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.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 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= 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 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/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.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
go.opentelemetry.io/otel v0.15.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA= go.opentelemetry.io/otel v0.15.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA=
go.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s= 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 return
} }
cdn, err := h.Service.CreateCDN(json) cdn, err := h.service.CreateCDN(json)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
return return
@ -68,7 +68,7 @@ func (h *Handlers) DestroyCDN(ctx *gin.Context) {
return return
} }
if err := h.Service.DestroyCDN(params.ID); err != nil { if err := h.service.DestroyCDN(params.ID); err != nil {
ctx.Error(err) ctx.Error(err)
return return
} }
@ -101,7 +101,7 @@ func (h *Handlers) UpdateCDN(ctx *gin.Context) {
return return
} }
cdn, err := h.Service.UpdateCDN(params.ID, json) cdn, err := h.service.UpdateCDN(params.ID, json)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
return return
@ -128,7 +128,7 @@ func (h *Handlers) GetCDN(ctx *gin.Context) {
return return
} }
cdn, err := h.Service.GetCDN(params.ID) cdn, err := h.service.GetCDN(params.ID)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
return return
@ -157,13 +157,13 @@ func (h *Handlers) GetCDNs(ctx *gin.Context) {
} }
h.setPaginationDefault(&query.Page, &query.PerPage) h.setPaginationDefault(&query.Page, &query.PerPage)
cdns, err := h.Service.GetCDNs(query) cdns, err := h.service.GetCDNs(query)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
return return
} }
totalCount, err := h.Service.CDNTotalCount(query) totalCount, err := h.service.CDNTotalCount(query)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
return return

View File

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

View File

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

View File

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

View File

@ -32,6 +32,6 @@ import (
// @Router /permissions [get] // @Router /permissions [get]
func (h *Handlers) GetPermissions(g *gin.Engine) func(ctx *gin.Context) { func (h *Handlers) GetPermissions(g *gin.Engine) func(ctx *gin.Context) {
return 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 return
} }
preheat, err := h.Service.CreatePreheat(json) preheat, err := h.service.CreatePreheat(json)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
return return
@ -68,7 +68,7 @@ func (h *Handlers) GetPreheat(ctx *gin.Context) {
return return
} }
preheat, err := h.Service.GetPreheat(params.ID) preheat, err := h.service.GetPreheat(params.ID)
if err != nil { if err != nil {
ctx.Error(err) ctx.Error(err)
return return

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -33,6 +33,7 @@ import (
"d7y.io/dragonfly/v2/manager/service" "d7y.io/dragonfly/v2/manager/service"
"d7y.io/dragonfly/v2/pkg/rpc" "d7y.io/dragonfly/v2/pkg/rpc"
"d7y.io/dragonfly/v2/pkg/rpc/manager" "d7y.io/dragonfly/v2/pkg/rpc/manager"
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
"google.golang.org/grpc" "google.golang.org/grpc"
) )
@ -87,7 +88,7 @@ func New(cfg *config.Config) (*Server, error) {
// Initialize REST server // Initialize REST server
restService := service.NewREST(db, cache, job, enforcer) 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 { if err != nil {
return nil, err return nil, err
} }
@ -104,7 +105,12 @@ func New(cfg *config.Config) (*Server, error) {
// Initialize GRPC server // Initialize GRPC server
grpcService := service.NewGRPC(db, cache, searcher) 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) manager.RegisterManagerServer(grpcServer, grpcService)
return &Server{ 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" "path/filepath"
"d7y.io/dragonfly/v2/internal/dfpath" "d7y.io/dragonfly/v2/internal/dfpath"
"d7y.io/dragonfly/v2/manager/config"
"d7y.io/dragonfly/v2/manager/handlers" "d7y.io/dragonfly/v2/manager/handlers"
"d7y.io/dragonfly/v2/manager/middlewares" "d7y.io/dragonfly/v2/manager/middlewares"
"d7y.io/dragonfly/v2/manager/service" "d7y.io/dragonfly/v2/manager/service"
@ -32,20 +33,23 @@ import (
ginprometheus "github.com/mcuadros/go-gin-prometheus" ginprometheus "github.com/mcuadros/go-gin-prometheus"
swaggerFiles "github.com/swaggo/files" swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger" ginSwagger "github.com/swaggo/gin-swagger"
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
) )
const ( 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 // Set mode
if !verbose { if !cfg.Verbose {
gin.SetMode(gin.ReleaseMode) gin.SetMode(gin.ReleaseMode)
} }
// Logging to a file // Logging to a file
if !console { if !cfg.Console {
gin.DisableConsoleColor() gin.DisableConsoleColor()
logDir := filepath.Join(dfpath.LogDir, "manager") logDir := filepath.Join(dfpath.LogDir, "manager")
f, _ := os.Create(filepath.Join(logDir, GinLogFileName)) 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) h := handlers.New(service)
// Prometheus // Prometheus
p := ginprometheus.NewPrometheus("dragonfly_manager") p := ginprometheus.NewPrometheus(PrometheusSubsystemName)
p.Use(r) p.Use(r)
// Opentelemetry
if cfg.Options.Telemetry.Jaeger != "" {
r.Use(otelgin.Middleware(OtelServiceName))
}
// CORS // CORS
corsConfig := cors.DefaultConfig() corsConfig := cors.DefaultConfig()
corsConfig.AllowAllOrigins = true corsConfig.AllowAllOrigins = true
@ -76,27 +85,27 @@ func Init(console bool, verbose bool, publicPath string, service service.REST, e
} }
// Manager View // Manager View
r.Use(static.Serve("/", static.LocalFile(publicPath, true))) r.Use(static.Serve("/", static.LocalFile(cfg.Server.PublicPath, true)))
// Router // Router
apiv1 := r.Group("/api/v1") apiv1 := r.Group("/api/v1")
// User // User
u := apiv1.Group("/users") u := apiv1.Group("/users")
u.GET("/:id", jwt.MiddlewareFunc(), rbac, h.GetUser) u.GET("/:id", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, h.GetUser)
u.POST("/signin", jwt.LoginHandler) u.POST("/signin", middlewares.Tracer(), jwt.LoginHandler)
u.POST("/signout", jwt.LogoutHandler) u.POST("/signout", middlewares.Tracer(), jwt.LogoutHandler)
u.POST("/signup", h.SignUp) u.POST("/signup", middlewares.Tracer(), h.SignUp)
u.GET("/signin/:name", h.OauthSignin) u.GET("/signin/:name", middlewares.Tracer(), h.OauthSignin)
u.GET("/signin/:name/callback", h.OauthSigninCallback(jwt)) u.GET("/signin/:name/callback", middlewares.Tracer(), h.OauthSigninCallback(jwt))
u.POST("/refresh_token", jwt.RefreshHandler) u.POST("/refresh_token", middlewares.Tracer(), jwt.RefreshHandler)
u.POST("/:id/reset_password", h.ResetPassword) u.POST("/:id/reset_password", middlewares.Tracer(), h.ResetPassword)
u.GET("/:id/roles", jwt.MiddlewareFunc(), rbac, h.GetRolesForUser) u.GET("/:id/roles", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, h.GetRolesForUser)
u.PUT("/:id/roles/:role", jwt.MiddlewareFunc(), rbac, h.AddRoleToUser) u.PUT("/:id/roles/:role", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, h.AddRoleToUser)
u.DELETE("/:id/roles/:role", jwt.MiddlewareFunc(), rbac, h.DeleteRoleForUser) u.DELETE("/:id/roles/:role", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac, h.DeleteRoleForUser)
// Role // Role
re := apiv1.Group("/roles", jwt.MiddlewareFunc(), rbac) re := apiv1.Group("/roles", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
re.POST("", h.CreateRole) re.POST("", h.CreateRole)
re.DELETE("/:role", h.DestroyRole) re.DELETE("/:role", h.DestroyRole)
re.GET("/:role", h.GetRole) 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) re.DELETE("/:role/permissions", h.DeletePermissionForRole)
// Permission // Permission
pm := apiv1.Group("/permissions", jwt.MiddlewareFunc(), rbac) pm := apiv1.Group("/permissions", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
pm.GET("", h.GetPermissions(r)) pm.GET("", h.GetPermissions(r))
// Oauth // Oauth
oa := apiv1.Group("/oauth", jwt.MiddlewareFunc(), rbac) oa := apiv1.Group("/oauth", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
oa.POST("", h.CreateOauth) oa.POST("", h.CreateOauth)
oa.DELETE(":id", h.DestroyOauth) oa.DELETE(":id", h.DestroyOauth)
oa.PATCH(":id", h.UpdateOauth) 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) oa.GET("", h.GetOauths)
// Scheduler Cluster // 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.POST("", h.CreateSchedulerCluster)
sc.DELETE(":id", h.DestroySchedulerCluster) sc.DELETE(":id", h.DestroySchedulerCluster)
sc.PATCH(":id", h.UpdateSchedulerCluster) 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) sc.PUT(":id/schedulers/:scheduler_id", h.AddSchedulerToSchedulerCluster)
// Scheduler // Scheduler
s := apiv1.Group("/schedulers", jwt.MiddlewareFunc(), rbac) s := apiv1.Group("/schedulers", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
s.POST("", h.CreateScheduler) s.POST("", h.CreateScheduler)
s.DELETE(":id", h.DestroyScheduler) s.DELETE(":id", h.DestroyScheduler)
s.PATCH(":id", h.UpdateScheduler) 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) s.GET("", h.GetSchedulers)
// CDN Cluster // 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.POST("", h.CreateCDNCluster)
cc.DELETE(":id", h.DestroyCDNCluster) cc.DELETE(":id", h.DestroyCDNCluster)
cc.PATCH(":id", h.UpdateCDNCluster) 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) cc.PUT(":id/scheduler-clusters/:scheduler_cluster_id", h.AddSchedulerClusterToCDNCluster)
// CDN // CDN
c := apiv1.Group("/cdns", jwt.MiddlewareFunc(), rbac) c := apiv1.Group("/cdns", jwt.MiddlewareFunc(), middlewares.Tracer(), rbac)
c.POST("", h.CreateCDN) c.POST("", h.CreateCDN)
c.DELETE(":id", h.DestroyCDN) c.DELETE(":id", h.DestroyCDN)
c.PATCH(":id", h.UpdateCDN) 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) c.GET("", h.GetCDNs)
// Security Group // 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.POST("", h.CreateSecurityGroup)
sg.DELETE(":id", h.DestroySecurityGroup) sg.DELETE(":id", h.DestroySecurityGroup)
sg.PATCH(":id", h.UpdateSecurityGroup) 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) sg.PUT(":id/cdn-clusters/:cdn_cluster_id", h.AddCDNClusterToSecurityGroup)
// Preheat // Preheat
ph := apiv1.Group("/preheats") ph := apiv1.Group("/preheats", middlewares.Tracer())
ph.POST("", h.CreatePreheat) ph.POST("", h.CreatePreheat)
ph.GET(":id", h.GetPreheat) 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 // Fallback To Manager View
r.NoRoute(func(c *gin.Context) { 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 return r, nil