datadog.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "context"
  4. "errors"
  5. "net/http"
  6. "os"
  7. "time"
  8. "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext"
  9. "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
  10. )
  11. const (
  12. dataDogSpanCtxKey = ctxKey("dataDogSpan")
  13. )
  14. func initDataDog() {
  15. if !conf.DataDogEnable {
  16. return
  17. }
  18. name := os.Getenv("DD_SERVICE")
  19. if len(name) == 0 {
  20. name = "imgproxy"
  21. }
  22. tracer.Start(
  23. tracer.WithService(name),
  24. tracer.WithServiceVersion(version),
  25. tracer.WithLogger(dataDogLogger{}),
  26. )
  27. }
  28. func stopDataDog() {
  29. tracer.Stop()
  30. }
  31. func startDataDogRootSpan(ctx context.Context, rw http.ResponseWriter, r *http.Request) (context.Context, context.CancelFunc, http.ResponseWriter) {
  32. span := tracer.StartSpan(
  33. "request",
  34. tracer.Measured(),
  35. tracer.SpanType("web"),
  36. tracer.Tag(ext.HTTPMethod, r.Method),
  37. tracer.Tag(ext.HTTPURL, r.RequestURI),
  38. )
  39. cancel := func() { span.Finish() }
  40. newRw := dataDogResponseWriter{rw, span}
  41. return context.WithValue(ctx, dataDogSpanCtxKey, span), cancel, newRw
  42. }
  43. func startDataDogSpan(ctx context.Context, name string) context.CancelFunc {
  44. rootSpan, _ := ctx.Value(dataDogSpanCtxKey).(tracer.Span)
  45. span := tracer.StartSpan(name, tracer.Measured(), tracer.ChildOf(rootSpan.Context()))
  46. return func() { span.Finish() }
  47. }
  48. func sendErrorToDataDog(ctx context.Context, err error) {
  49. rootSpan, _ := ctx.Value(dataDogSpanCtxKey).(tracer.Span)
  50. rootSpan.Finish(tracer.WithError(err))
  51. }
  52. func sendTimeoutToDataDog(ctx context.Context, d time.Duration) {
  53. rootSpan, _ := ctx.Value(dataDogSpanCtxKey).(tracer.Span)
  54. rootSpan.SetTag("timeout_duration", d)
  55. rootSpan.Finish(tracer.WithError(errors.New("Timeout")))
  56. }
  57. type dataDogLogger struct {
  58. }
  59. func (l dataDogLogger) Log(msg string) {
  60. logNotice(msg)
  61. }
  62. type dataDogResponseWriter struct {
  63. rw http.ResponseWriter
  64. span tracer.Span
  65. }
  66. func (ddrw dataDogResponseWriter) Header() http.Header {
  67. return ddrw.rw.Header()
  68. }
  69. func (ddrw dataDogResponseWriter) Write(data []byte) (int, error) {
  70. return ddrw.rw.Write(data)
  71. }
  72. func (ddrw dataDogResponseWriter) WriteHeader(statusCode int) {
  73. ddrw.span.SetTag(ext.HTTPCode, statusCode)
  74. ddrw.rw.WriteHeader(statusCode)
  75. }