Documentation ¶
Index ¶
- Constants
- func ConfiguredCollectors() []prometheus.Collector
- func DisambiguateEventSource(payload []byte) (string, interface{}, error)
- func GenericHandlerRateLimited(c ControllerInterface, rl RateLimiter, params interface{}) middleware.Responder
- func GetRedis(redisAddr, redisPassword string, useRedisSentinel bool, ...) *redis.Client
- func SetDeniedResponseHeaders(limitsData *redis_rate.Result, response RequestDeniedHeadersSetter, ...)
- func SetPermittedResponseHeaders(limitsData *redis_rate.Result, response RequestPermittedHeadersSetter)
- type BatchPackage
- type ClickhouseIngester
- func (c *ClickhouseIngester) IngestEventData(ctx context.Context, projectID uint64, _ string, payload []byte, ...) error
- func (c *ClickhouseIngester) IngestMessageData(ctx context.Context, projectID uint64, _ string, payload []byte, ...) error
- func (c *ClickhouseIngester) IngestSessionData(ctx context.Context, projectID uint64, _ string, payload []byte, ...) error
- type Controller
- func (c *Controller) DeleteProject(params projects.DeleteProjectParams) middleware.Responder
- func (c *Controller) DeleteProjectRateLimited(params projects.DeleteProjectParams) middleware.Responder
- func (c *Controller) GetError(params errors.GetErrorParams) middleware.Responder
- func (c *Controller) GetErrorRateLimited(params errors.GetErrorParams) middleware.Responder
- func (c *Controller) GetStatsV2(_ errors_v2.GetStatsV2Params) middleware.Responder
- func (c *Controller) ListErrors(params errors.ListErrorsParams) middleware.Responder
- func (c *Controller) ListErrorsRateLimited(params errors.ListErrorsParams) middleware.Responder
- func (c *Controller) ListEvents(params errors.ListEventsParams) middleware.Responder
- func (c *Controller) ListEventsRateLimited(params errors.ListEventsParams) middleware.Responder
- func (c *Controller) ListMessages(params messages.ListMessagesParams) middleware.Responder
- func (c *Controller) ListMessagesRateLimited(params messages.ListMessagesParams) middleware.Responder
- func (c *Controller) ListProjects(params errors_v2.ListProjectsParams) middleware.Responder
- func (c *Controller) PostEnvelopeHandler(params events.PostProjectsAPIProjectIDEnvelopeParams) middleware.Responder
- func (c *Controller) PostEnvelopeHandlerRateLimited(params events.PostProjectsAPIProjectIDEnvelopeParams) middleware.Responder
- func (c *Controller) PostStoreHandler(params events.PostProjectsAPIProjectIDStoreParams) middleware.Responder
- func (c *Controller) PostStoreHandlerRateLimited(params events.PostProjectsAPIProjectIDStoreParams) middleware.Responder
- func (c *Controller) QueueProcessor(buffer []interface{}) error
- func (c *Controller) UpdateError(params errors.UpdateErrorParams) middleware.Responder
- func (c *Controller) UpdateErrorRateLimited(params errors.UpdateErrorParams) middleware.Responder
- type ControllerInterface
- type Database
- type DatabaseOptions
- type EventErrorHandler
- type EventMessageHandler
- type EventsBatchPackage
- type FrequencyPair
- type ISentryEventHandler
- type Ingester
- type Insertable
- type QueueIngester
- func (q *QueueIngester) IngestEventData(ctx context.Context, projectID uint64, payloadType string, payload []byte, ...) error
- func (q *QueueIngester) IngestMessageData(ctx context.Context, projectID uint64, payloadType string, payload []byte, ...) error
- func (q *QueueIngester) IngestSessionData(ctx context.Context, projectID uint64, payloadType string, payload []byte, ...) error
- type QueueItem
- type QueueItemHandler
- type RateLimiter
- type RateLimiterBackend
- type RequestDeniedHeadersSetter
- type RequestPermittedHeadersSetter
- type SentryExceptionManager
- type SentryMessageManager
- type SessionHandler
Constants ¶
const ( StoreEndpoint string = "store" EnvelopeEndpoint string = "event" UnknownEndpoint string = "unknown" )
const ( IDTypeProject = "project" IDTypeGroup = "organization" EndpointTypeWrite = "write" EndpointTypeRead = "read" )
Variables ¶
This section is empty.
Functions ¶
func ConfiguredCollectors ¶
func ConfiguredCollectors() []prometheus.Collector
func DisambiguateEventSource ¶
func GenericHandlerRateLimited ¶
func GenericHandlerRateLimited( c ControllerInterface, rl RateLimiter, params interface{}, ) middleware.Responder
GenericHandlerRateLimited wraps individual handlers to add rate limiting. Unfortunately, due to how go-openapi generates code, we need this DYI "middleware" to handle multiple different types in an uniform manner without too much copy-paste.
NOTE(prozlach): Unfortunately I was not able to use go-openapi's middleware:
- there is no sane way to pass state to the middleware code just like e.g. Gin does with with its contexts.
- passing RateLimiter as a field in the Controller struct is consistent with how we e.g. handle Queue.
- we would need to parse/extract group/project ID for every request if we went with middleware as the request params are not available there
func SetDeniedResponseHeaders ¶
func SetDeniedResponseHeaders( limitsData *redis_rate.Result, response RequestDeniedHeadersSetter, idType string, )
func SetPermittedResponseHeaders ¶
func SetPermittedResponseHeaders( limitsData *redis_rate.Result, response RequestPermittedHeadersSetter, )
Types ¶
type BatchPackage ¶
func (*BatchPackage) Add ¶
func (b *BatchPackage) Add(data ...interface{}) error
type ClickhouseIngester ¶
type ClickhouseIngester struct {
// contains filtered or unexported fields
}
func (*ClickhouseIngester) IngestEventData ¶
func (*ClickhouseIngester) IngestMessageData ¶
type Controller ¶
type Controller struct {
// contains filtered or unexported fields
}
func NewController ¶
func NewController( baseURL *url.URL, db Database, cloudDB Database, gatekeeperURL *url.URL, queue *persistentqueue.Queue, rateLimiter RateLimiter, ) *Controller
func (*Controller) DeleteProject ¶
func (c *Controller) DeleteProject(params projects.DeleteProjectParams) middleware.Responder
func (*Controller) DeleteProjectRateLimited ¶
func (c *Controller) DeleteProjectRateLimited( params projects.DeleteProjectParams, ) middleware.Responder
DeleteProjectRateLimited is just an adapter for GenericHandlerRateLimited.
func (*Controller) GetError ¶
func (c *Controller) GetError(params errors.GetErrorParams) middleware.Responder
func (*Controller) GetErrorRateLimited ¶
func (c *Controller) GetErrorRateLimited( params errors.GetErrorParams, ) middleware.Responder
GetErrorRateLimited is just an adapter for GenericHandlerRateLimited.
func (*Controller) GetStatsV2 ¶
func (c *Controller) GetStatsV2(_ errors_v2.GetStatsV2Params) middleware.Responder
func (*Controller) ListErrors ¶
func (c *Controller) ListErrors(params errors.ListErrorsParams) middleware.Responder
func (*Controller) ListErrorsRateLimited ¶
func (c *Controller) ListErrorsRateLimited( params errors.ListErrorsParams, ) middleware.Responder
ListErrorsRateLimited is just an adapter for GenericHandlerRateLimited.
func (*Controller) ListEvents ¶
func (c *Controller) ListEvents(params errors.ListEventsParams) middleware.Responder
func (*Controller) ListEventsRateLimited ¶
func (c *Controller) ListEventsRateLimited( params errors.ListEventsParams, ) middleware.Responder
ListEventsRateLimited is just an adapter for GenericHandlerRateLimited.
func (*Controller) ListMessages ¶
func (c *Controller) ListMessages(params messages.ListMessagesParams) middleware.Responder
func (*Controller) ListMessagesRateLimited ¶
func (c *Controller) ListMessagesRateLimited( params messages.ListMessagesParams, ) middleware.Responder
ListMessagesRateLimited is just an adapter for GenericHandlerRateLimited.
func (*Controller) ListProjects ¶
func (c *Controller) ListProjects(params errors_v2.ListProjectsParams) middleware.Responder
ListProjects calls back the gatekeeper with the auth headers or user session so we can list GitLab projects.
func (*Controller) PostEnvelopeHandler ¶
func (c *Controller) PostEnvelopeHandler( params events.PostProjectsAPIProjectIDEnvelopeParams, ) middleware.Responder
PostEnvelopeHandler handles the POST request sent to the /projects/{projectID}/envelope route. Data model for Sentry envelope can have multiple item types:
> See https://develop.sentry.dev/sdk/envelopes/#data-model
We currently accept the following item types: - event [https://develop.sentry.dev/sdk/envelopes/#event]
- exceptions [https://develop.sentry.dev/sdk/event-payloads/exception/]
- messages [https://develop.sentry.dev/sdk/event-payloads/message/]
- stacktrace [https://develop.sentry.dev/sdk/event-payloads/stacktrace/]
- sessions [https://develop.sentry.dev/sdk/envelopes/#session] > See [https://develop.sentry.dev/sdk/sessions/] for more details.
We do not yet support:
- transaction [https://develop.sentry.dev/sdk/envelopes/#transaction] > From [https://develop.sentry.dev/sdk/event-payloads/transaction/], it can also include an exception internally but we do not support it yet.
- attachment [https://develop.sentry.dev/sdk/envelopes/#attachment]
- and many more item types...
func (*Controller) PostEnvelopeHandlerRateLimited ¶
func (c *Controller) PostEnvelopeHandlerRateLimited( params events.PostProjectsAPIProjectIDEnvelopeParams, ) middleware.Responder
PostEnvelopeHandlerRateLimited is just an adapter for GenericHandlerRateLimited.
func (*Controller) PostStoreHandler ¶
func (c *Controller) PostStoreHandler( params events.PostProjectsAPIProjectIDStoreParams, ) middleware.Responder
func (*Controller) PostStoreHandlerRateLimited ¶
func (c *Controller) PostStoreHandlerRateLimited( params events.PostProjectsAPIProjectIDStoreParams, ) middleware.Responder
PostStoreHandlerRateLimited is just an adapter for GenericHandlerRateLimited.
func (*Controller) QueueProcessor ¶
func (c *Controller) QueueProcessor(buffer []interface{}) error
func (*Controller) UpdateError ¶
func (c *Controller) UpdateError(params errors.UpdateErrorParams) middleware.Responder
func (*Controller) UpdateErrorRateLimited ¶
func (c *Controller) UpdateErrorRateLimited( params errors.UpdateErrorParams, ) middleware.Responder
UpdateErrorRateLimited is just an adapter for GenericHandlerRateLimited.
type ControllerInterface ¶
type ControllerInterface interface { PostEnvelopeHandlerRateLimited(params events.PostProjectsAPIProjectIDEnvelopeParams) middleware.Responder PostEnvelopeHandler(params events.PostProjectsAPIProjectIDEnvelopeParams) middleware.Responder PostStoreHandlerRateLimited(params events.PostProjectsAPIProjectIDStoreParams) middleware.Responder PostStoreHandler(params events.PostProjectsAPIProjectIDStoreParams) middleware.Responder ListErrorsRateLimited(params errors.ListErrorsParams) middleware.Responder ListErrors(params errors.ListErrorsParams) middleware.Responder GetErrorRateLimited(params errors.GetErrorParams) middleware.Responder GetError(params errors.GetErrorParams) middleware.Responder UpdateErrorRateLimited(params errors.UpdateErrorParams) middleware.Responder UpdateError(params errors.UpdateErrorParams) middleware.Responder ListEventsRateLimited(params errors.ListEventsParams) middleware.Responder ListEvents(params errors.ListEventsParams) middleware.Responder DeleteProjectRateLimited(params projects.DeleteProjectParams) middleware.Responder DeleteProject(params projects.DeleteProjectParams) middleware.Responder ListProjects(params errors_v2.ListProjectsParams) middleware.Responder GetStatsV2(_ errors_v2.GetStatsV2Params) middleware.Responder ListMessagesRateLimited(params messages.ListMessagesParams) middleware.Responder ListMessages(params messages.ListMessagesParams) middleware.Responder }
ControllerInterface ...
type Database ¶
type Database interface { GetConn() (*clickhouse.Conn, error) GetTZ() (*time.Location, error) InsertErrorTrackingErrorEvent(ctx context.Context, e *et.ErrorTrackingErrorEvent) error InsertErrorTrackingMessageEvent(ctx context.Context, e *et.ErrorTrackingMessageEvent) error InsertErrorTrackingSession(ctx context.Context, e *et.ErrorTrackingSession) error ListErrors(params errors.ListErrorsParams) ([]*models.Error, error) ListEvents(params errors.ListEventsParams) ([]*models.ErrorEvent, error) ListMessages(params messages.ListMessagesParams) ([]*models.MessageEvent, error) GetError(params errors.GetErrorParams) (*models.Error, error) UpdateError(params errors.UpdateErrorParams) (*models.Error, error) DeleteProject(params projects.DeleteProjectParams) error Close() error }
func NewCloudDB ¶
func NewCloudDB(clickHouseDsn string, opts *DatabaseOptions) (Database, error)
type DatabaseOptions ¶
type EventErrorHandler ¶
type EventErrorHandler struct{}
func (*EventErrorHandler) Handle ¶
func (e *EventErrorHandler) Handle( projectID uint64, item interface{}, payload []byte, b *EventsBatchPackage, ) error
type EventMessageHandler ¶
type EventMessageHandler struct{}
func (*EventMessageHandler) Handle ¶
func (me *EventMessageHandler) Handle( projectID uint64, item interface{}, payload []byte, b *EventsBatchPackage, ) error
type EventsBatchPackage ¶
type EventsBatchPackage struct { ErrorV1EventsBatch BatchPackage ErrorV1StatusBatch BatchPackage MessageEventsBatch BatchPackage SessionsBatch BatchPackage }
func (*EventsBatchPackage) Send ¶
func (ebp *EventsBatchPackage) Send()
type FrequencyPair ¶
type FrequencyPair [2]uint64
type ISentryEventHandler ¶
type ISentryEventHandler interface { Validate(e *types.Event) error InsertEvent(ctx context.Context, projectID uint64, payloadType string, e *types.Event, payload []byte) error }
func GetEventManager ¶
func GetEventManager(dataItemType string, ingester Ingester) (ISentryEventHandler, error)
type Ingester ¶
type Ingester interface { IngestEventData(context.Context, uint64, string, []byte, *types.Event) error IngestMessageData(context.Context, uint64, string, []byte, *types.Event) error IngestSessionData(context.Context, uint64, string, []byte, *types.Session) error }
func NewClickhouseIngester ¶
func NewQueueIngester ¶
func NewQueueIngester(queue *persistentqueue.Queue) Ingester
type Insertable ¶
type QueueIngester ¶
type QueueIngester struct {
// contains filtered or unexported fields
}
func (*QueueIngester) IngestEventData ¶
func (*QueueIngester) IngestMessageData ¶
type QueueItem ¶
type QueueItem struct { Type string `json:"type"` Payload []byte `json:"payload"` ProjectID uint64 `json:"projectID"` }
When client-side buffering is enabled, we only buffer the received payload once validated. All post-processing is then delegated to a queue consuming process to keep write paths as performant as possible.
type QueueItemHandler ¶
type QueueItemHandler interface {
Handle(projectID uint64, item interface{}, payload []byte, b *EventsBatchPackage) error
}
type RateLimiter ¶
type RateLimiter interface { IsAllowed(context.Context, int, string, string) (*redis_rate.Result, error) SetLimits(*ratelimiting.LimitsConfig) }
func NewNullRateLimiter ¶
func NewNullRateLimiter() RateLimiter
func NewRateLimiter ¶
func NewRateLimiter(limiter RateLimiterBackend) RateLimiter
type RateLimiterBackend ¶
type SentryExceptionManager ¶
type SentryExceptionManager struct {
// contains filtered or unexported fields
}
func (*SentryExceptionManager) InsertEvent ¶
type SentryMessageManager ¶
type SentryMessageManager struct {
// contains filtered or unexported fields
}
func (*SentryMessageManager) InsertEvent ¶
type SessionHandler ¶
type SessionHandler struct{}
func (*SessionHandler) Handle ¶
func (s *SessionHandler) Handle( projectID uint64, item interface{}, payload []byte, b *EventsBatchPackage) error