- 客戶端采樣配置
當使用配置對象實例化跟蹤器時,可以通過
sampler.type
和sampler.param
屬性選擇采樣類型.Jaeger庫支持以下采樣器:
-
常量(
sampler.type=const
)采樣器始終對所有traces做出相同的決定。它要么采樣所有跟蹤(sampler.param=1
),要么都不采樣(sampler.param=0
)。 -
概率 (
sampler.type=probabilistic
)采樣器做出隨機采樣決策,采樣概率等於sampler.param
屬性的值。例如,在sampler.param=0.1
的情況下,將在10條跡線中大約采樣1條。 -
Rate Limiting(
sampler.type=ratelimiting
)采樣器使用漏斗速率限制器來確保以一定的恆定速率對軌跡進行采樣。例如,當sampler.param=2.0
時,它將以每秒2條跡線的速率對請求進行采樣。 -
遠程(
sampler.type=remote
,這也是默認值),采樣器會向Jaeger代理咨詢有關在當前服務中使用的適當采樣策略。
- 動態采樣策略
1. jaeger-client-go 默認輪訓通過http協議從jaeger-agent 讀取采樣率, 舉個例子:
curl http://127.0.0.1:5778/sampling?service=jaeger4go {"strategyType":"PROBABILISTIC","probabilisticSampling":{"samplingRate":0.1}}%
代碼主要在sampler_remote.go 文件
// UpdateSampler forces the sampler to fetch sampling strategy from backend server. // This function is called automatically on a timer, but can also be safely called manually, e.g. from tests. func (s *RemotelyControlledSampler) UpdateSampler() { res, err := s.samplingFetcher.Fetch(s.serviceName) if err != nil { s.metrics.SamplerQueryFailure.Inc(1) s.logger.Infof("failed to fetch sampling strategy: %v", err) return } strategy, err := s.samplingParser.Parse(res) if err != nil { s.metrics.SamplerUpdateFailure.Inc(1) s.logger.Infof("failed to parse sampling strategy response: %v", err) return } s.Lock() defer s.Unlock() s.metrics.SamplerRetrieved.Inc(1) if err := s.updateSamplerViaUpdaters(strategy); err != nil { s.metrics.SamplerUpdateFailure.Inc(1) s.logger.Infof("failed to handle sampling strategy response %+v. Got error: %v", res, err) return } s.metrics.SamplerUpdated.Inc(1) }
2. jaeger-agent 通過5778 提供http 服務 ,jaeger-client-go 每次請求jaeger-agent 的 http://ip:5778/sampling 地址,jaeger-agent 以grpc方式請求jaeger-collector
NewHTTPServer in github.com/jaegertracing/jaeger/cmd/agent/app/httpserver/srv.go //注冊http sampling 地址
HTTPServerConfiguration.getHTTPServer in github.com/jaegertracing/jaeger/cmd/agent/app/builder.go //RegisterRoutes
*Builder.CreateAgent in github.com/jaegertracing/jaeger/cmd/agent/app/builder.go //getHTTPServer
func(*cobra.Command, []string) error in github.com/jaegertracing/jaeger/cmd/agent/main.go //CreateAgent
注冊http sampling 地址后,每次請求本地jaeger-agent的http://127.0.0.1:5778/sampling地址,
jaeger-agent grpc請求jaeger-collector
// GetSamplingStrategy returns sampling strategies from collector. func (s *SamplingManager) GetSamplingStrategy(ctx context.Context, serviceName string) (*sampling.SamplingStrategyResponse, error) { r, err := s.client.GetSamplingStrategy(ctx, &api_v2.SamplingStrategyParameters{ServiceName: serviceName}) if err != nil { return nil, err } return jaeger.ConvertSamplingResponseFromDomain(r) }
3. jaeger-collector 可以本地通過json文件讀取采樣率,但是json文件更新,jaeger-collector 不會動態加載json 文件
- 官方動態采樣策略的不足
由於 jaeger-collector 不會動態加載json 文件 ,所以通過jaeger-collector 控制jaeger-client-go 的采樣率是不行的
- 解決方案
既然jaeger-client-go 可以http 請求jaeger-agent ,那我我們也可以指定自己的配置中心
cfg := jaegercfg.Configuration{
ServiceName: servicename,
Sampler: &jaegercfg.SamplerConfig{
Type: jaeger.SamplerTypeRemote,
SamplingServerURL: "http://themaster:5778/sampling",
},
Reporter: &jaegercfg.ReporterConfig{
LogSpans: false,
BufferFlushInterval: 1 * time.Second,
},
}