github.com/vseinstrumentiru/lego@v1.0.2/internal/lego/monitor/errorhandler/sentryprovider/sentry.go (about)

     1  package sentryprovider
     2  
     3  import (
     4  	"github.com/getsentry/sentry-go"
     5  	"github.com/pkg/errors"
     6  	lego2 "github.com/vseinstrumentiru/lego/internal/lego"
     7  	"os"
     8  	"time"
     9  )
    10  
    11  // Handler is responsible for sending errors to Sentry.
    12  type SentryHandler struct{}
    13  
    14  // New creates a new handler.
    15  func New(p lego2.Process, dsn string) (*SentryHandler, error) {
    16  	serverName := p.Name()
    17  	if p.DataCenterName() != "" {
    18  		serverName += ":" + p.DataCenterName()
    19  	}
    20  
    21  	release := p.Build().Version
    22  	if release != "" {
    23  		release += "@"
    24  	}
    25  	release += p.Build().CommitHash
    26  
    27  	err := sentry.Init(sentry.ClientOptions{
    28  		Dsn:              dsn,
    29  		Debug:            p.IsDebug(),
    30  		AttachStacktrace: true,
    31  		ServerName:       p.Name(),
    32  		Environment:      p.Env(),
    33  		Release:          release,
    34  	})
    35  
    36  	host, _ := os.Hostname()
    37  	dataCenter := p.DataCenterName()
    38  	branch := p.Build().Version
    39  
    40  	sentry.ConfigureScope(func(scope *sentry.Scope) {
    41  		scope.SetTag("data-center", dataCenter)
    42  		scope.SetTag("branch", branch)
    43  		scope.SetTag("host", host)
    44  	})
    45  
    46  	if err != nil {
    47  		return nil, errors.Wrap(err, "failed to create sentry client")
    48  	}
    49  
    50  	return &SentryHandler{}, nil
    51  }
    52  
    53  func (h *SentryHandler) Handle(err error) {
    54  	if err == error(nil) || err == nil {
    55  		return
    56  	}
    57  
    58  	sentry.CaptureException(err)
    59  }
    60  
    61  func (h *SentryHandler) Close() error {
    62  	sentry.Flush(2 * time.Second)
    63  
    64  	return nil
    65  }