David Chou @ Golang Taipei / Crescendo Lab
CC-BY-SA-3.0-TW
david74.chou @ gmail
david74.chou @ facebook
david74chou @ telegram
$ ddtrace-run python app.pyr := gin.New()
r.Use(gintrace.Middleware("web-app"))if s, ok := tracer.SpanFromContext(ctx); ok {
_ = tracer.Inject(s.Context(),
tracer.HTTPHeadersCarrier(req.Header),
)
}func doSomething() {
span := tracer.StartSpan("do.something")
defer span.Finish()
// do something cool
}type SearchRepository interface {
SearchMessages(ctx context.Context, ...) (*chat.Result, error)
SearchMembersByName(ctx context.Context, ...) (*chat.Result, error)
... more ...
}
func NewSearchService(r SearchRepository) SearchService {
return SearchService {
searchRepo: r,
}
}type SearchRepository interface {
SearchMessages(ctx context.Context, ...) (*chat.Result, error)
SearchMembersByName(ctx context.Context, ...) (*chat.Result, error)
... more ...
}
func NewSearchService(r SearchRepository) SearchService {
return SearchService {
searchRepo: autotrace.NewSearchRepositoryTracer(r),
}
}//go:generate gowrap gen -g -p . -i SearchRepository
// -t file://template/ddog-trace.tmpl -o ./autotrace/search_repository.go
type SearchRepository interface {
SearchMessages(ctx context.Context, ...) (*chat.Result, error)
SearchMembersByName(ctx context.Context, ...) (*chat.Result, error)
... more ...
}// Code generated by gowrap. DO NOT EDIT.
// template: ../../../../../template/ddog-trace.tmpl
package autotrace
type SearchRepositoryTracer struct {
SearchRepository
}
func NewSearchRepositoryTracer(base SearchRepository) SearchRepositoryTracer {
return SearchRepositoryTracer{
SearchRepository: base,
}
}
// SearchMessages implements chat.SearchRepository
func (d SearchRepositoryTracer) SearchMessages(ctx context.Context, ...)
(rp1 *chat.ResultMessageSearch, e1 error) {
span, ctx := tracer.StartSpanFromContext(ctx, "SearchRepository.SearchMessages")
defer func() {
span.Finish(d.withError(map[string]interface{}{
"rp1": rp1,
"e1": e1}))
}()
return d.SearchRepository.SearchMessages(ctx, channelID, searchText)
}
... more ...type {{$decorator}} struct {
{{.Interface.Name}}
}
func New{{$decorator}}(base {{.Interface.Name}}) {{$decorator}} {
return {{$decorator}}{
{{.Interface.Name}}: base,
}
}
{{range $method := .Interface.Methods}}
{{if $method.AcceptsContext}}
// {{$method.Name}} implements {{$.Interface.Type}}
func (d {{$decorator}}) {{$method.Declaration}} {
span, ctx := tracer.StartSpanFromContext(ctx, "{{$.Interface.Name}}.{{$method.Name}}")
defer func() {
span.Finish(d.withError({{$method.ResultsMap}}))
}()
{{$method.Pass (printf "d.%s." $.Interface.Name) }}
}
{{end}}
{{end}}