jaeger-動態配置采樣率


  • 客戶端采樣配置
        當使用配置對象實例化跟蹤器時,可以通過sampler.typesampler.param屬性選擇采樣類型.Jaeger庫支持以下采樣器:
  1.  常量(sampler.type=const)采樣器始終對所有traces做出相同的決定。
    它要么采樣所有跟蹤(sampler.param=1),要么都不采樣(sampler.param=0)。
  2. 概率 (sampler.type=probabilistic)采樣器做出隨機采樣決策,
    采樣概率等於sampler.param屬性的值。例如,在sampler.param=0.1的情況下,將在10條跡線中大約采樣1條。
  3. Rate Limiting(sampler.type=ratelimiting)采樣器使用漏斗速率限制器來確保以一定的恆定速率對軌跡進行采樣。
    例如,當sampler.param=2.0時,它將以每秒2條跡線的速率對請求進行采樣。
  4. 遠程(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,
},
}

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM