获取更多动态,关注公众号:黑客下午茶

Sampling Transactions

你可以通过两种方式控制发送到 Sentry 的 transactions 的量。

Uniform Sample Rate

如果您希望 transactions 的 cross-section 均匀,无论您在应用程序中的何处或在什么情况下发生,并且对下文所述的默认继承和优先级行为感到满意,设置统一采样率都是一个不错的选择。

To do this, set the TracesSampleRate option in your sentry.Init() to a number between 0.0 and 1.0. With this option set, every transaction created will have that percentage chance of being sent to Sentry. (So, for example, if you set TracesSampleRate to 0.2, approximately 20% of your transactions will get recorded and sent.) That looks like this:

Copied
err := sentry.Init(sentry.ClientOptions{
	TracesSampleRate: 0.2,
})

Dynamic Sampling Function

如果您满足以下条件,则提供采样功能是一个不错的选择:

  • 想要以不同的 rates 采样不同的 transactions
  • 想要完全过滤掉一些 transactions
  • 要修改下面描述的默认优先级和继承行为

To sample dynamically, set the TracesSampler option in your sentry.Init() to a function that will accept a SamplingContext and return a sampling decision: true, false or undefined. For example:

Copied
err := sentry.Init(sentry.ClientOptions{
	// ...
	TracesSampler: sentry.TracesSamplerFunc(func(ctx sentry.SamplingContext) sentry.Sampled {
		switch {
		case condition1:
			return sentry.UniformTracesSampler(0.2).Sample(ctx)
		case condition2:
			return sentry.UniformTracesSampler(0.01).Sample(ctx)
		case condition3:
			return sentry.SampledFalse
		default:
			return sentry.UniformTracesSampler(0.1).Sample(ctx)
		}
	}),
})

Default Sampling Context Data

创建 transaction 时,传递给 TracesSamplerSamplingContext 对象中包含的信息因平台和集成而异。

For the Go SDK, it is:

Copied
type SamplingContext struct {
	Span   *Span // The current span, always non-nil.
	Parent *Span // The parent span, may be nil.
}

Custom Sampling Context Data

手动创建 transaction 时,可以通过将数据作为可选的第二个参数传递给 StartTransaction 来将数据添加到 SamplingContext。如果您希望采样器可以访问但不想将其作为 tagsdata 附加到 transaction 中的数据(例如敏感信息或太大而无法随 transaction 发送的信息),这将非常有用。例如:

Copied
type myContextKey struct{}
type myContextData struct {
	// Store information for custom TracesSampler.
	request *http.Request
	// ...
}

err := sentry.Init(sentry.ClientOptions{
	// A custom TracesSampler can access data from the span's context:
	TracesSampler: sentry.TracesSamplerFunc(func(ctx sentry.SamplingContext) sentry.Sampled {
		data, ok := ctx.Span.Context().Value(myContextKey{}).(*myContextData)
		if !ok {
			return sentry.SampledFalse
		}
		if data.request.URL.Hostname() == "example.com" {
			return sentry.SampledTrue
		}
		return sentry.SampledFalse
	}),
})
// ...

r, err := http.NewRequest("GET", "http://example.com", nil)
// ...
data := &myContextData{
	request: r,
}
ctx := context.WithValue(context.Background(), myContextKey{}, data)
span := sentry.StartSpan(ctx, "operation")
// When sampling the above span, the custom TracesSampler will have
// access to data.

// ...
span.Finish()

Inheritance

无论 transaction 的抽样决策是什么,该决策都将传递给其 child spans,并从那里传递给它们随后在其他服务中引起的任何 transactions。(有关如何完成传播的更多信息,请参见 Connecting Backend and Frontend Transactions。)

如果当前正在创建的 transaction 是那些后续 transactions 之一(换句话说,如果它具有父 transaction),则上游(父)抽样决策将始终包含在抽样上下文数据中,以便您的 TracesSampler 选择是否和何时继承该决定。(在大多数情况下,继承是正确的选择,这样就不会出现部分跟踪。)

在某些 SDK 中,为方便起见,TracesSampler 函数可以返回一个布尔值,这样,如果这是期望的行为,则可以直接返回父级的决策。

Copied
err := sentry.Init(sentry.ClientOptions{
	TracesSampler: sentry.TracesSamplerFunc(func(ctx sentry.SamplingContext) sentry.Sampled {
		// Inherit decision from parent.
		if ctx.Parent != nil && ctx.Parent.Sampled != sentry.SampledUndefined {
			return ctx.Parent.Sampled
		}
		// Or continue with a custom decision...
	}),
})

如果您使用的是 TracesSampleRate 而不是 TracesSampler ,则该决策将始终被继承。

Forcing a Sampling Decision

如果在 transaction 创建时知道是否要将 transaction 发送给 Sentry,则还可以选择将抽样决策直接传递给 transaction 构造函数(请注意,不在 CustomSamplingContext 对象中)。 如果这样做,则 transaction 将不受 TracesSampleRate 的约束,也不会运行TracesSampler,因此您可以指望通过的决策不会被覆盖。

Copied
// If starting the first span in a transaction (no other spans in the context):
sentry.StartSpan(context.Background(), "operation",
	sentry.TransactionName("name"),
	func(s *sentry.Span) { s.Sampled = sentry.SampledTrue },
)

// If the transaction was already started, for example in an HTTP handler:
transaction := sentry.TransactionFromContext(request.Context())
transaction.Sampled = sentry.SampledTrue

Precedence

transaction 有多种方法可以得出抽样决策。

  • 根据在 TracesSampleRate 中设置的静态采样率进行随机采样
  • 根据 TracesSampler 返回的动态采样率进行随机采样
  • TracesSampler 返回的绝对决策(100% 机会或 0% 机会)
  • 如果交易有父级,则继承其父级的抽样决策
  • 绝对决策权传递给 StartTransaction

当有可能出现不止一种情况时,应遵循以下优先规则:

  1. 如果将抽样决策传递给 StartTransaction(请参见上面的 Forcing a Sampling Decision),则无论其他任何因素,都将使用该决策。
  2. 如果定义了 TracesSampler ,则将使用其决策。它可以选择保留或忽略任何父抽样决策,或者使用抽样上下文数据做出自己的决策,或者为 transaction 选择抽样率。
  3. 如果未定义 TracesSampler,但是有一个父采样决策,则将使用父采样决策。
  4. 如果未定义 TracesSampler 且没有父级采样决策,则将使用 TracesSampleRate
You can edit this page on GitHub.