中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

重慶網站建設合肥公司網站怎么宣傳

重慶網站建設合肥公司,網站怎么宣傳,中國建設銀行客服,wordpress 創(chuàng)建數(shù)據表服務間鏈路追蹤傳播機制是指在微服務架構中,通過記錄和跟蹤服務之間的請求和響應信息,來實現(xiàn)對服務間鏈路的追蹤和監(jiān)控。這種機制可以幫助開發(fā)人員快速定位服務間出現(xiàn)的問題,并進行優(yōu)化和調整。 具體來說,服務間鏈路追蹤傳播機制…

服務間鏈路追蹤傳播機制是指在微服務架構中,通過記錄和跟蹤服務之間的請求和響應信息,來實現(xiàn)對服務間鏈路的追蹤和監(jiān)控。這種機制可以幫助開發(fā)人員快速定位服務間出現(xiàn)的問題,并進行優(yōu)化和調整。

具體來說,服務間鏈路追蹤傳播機制可以通過在每個服務的請求和響應中添加唯一標識符來實現(xiàn)。當一個服務發(fā)送請求到另一個服務時,它會將自己的唯一標識符添加到請求頭中,并發(fā)送給目標服務。目標服務收到請求后,會將請求頭中的唯一標識符復制到響應頭中,并返回給調用方。調用方收到響應后,可以通過唯一標識符來追蹤服務間的調用鏈路。

為了實現(xiàn)服務間鏈路追蹤傳播機制,通常會使用一些開源工具或框架,比如OpenTelemetry、DataDog、Zipkin、SkyWalking 等。這些工具可以自動記錄服務間的請求和響應信息,并提供可視化的界面來幫助開發(fā)人員進行調試和優(yōu)化。

通常,我們會將這種特殊標識的請求頭稱之為傳播協(xié)議。

常見傳播協(xié)議

不同的 APM 工具支持一種或者多種傳播協(xié)議,以便更好的服務于應用。

  • b3
  • uber
  • sw8
  • w3c
  • datadog
  • ot

傳播協(xié)議與APM產品

OpenTelemetry 除了原生支持 ot、w3c 、 b3uber幾種協(xié)議外,通過:opentelemetry-collector-contrib 支持 sw8datadog傳播協(xié)議。

B3 協(xié)議

B3 傳播協(xié)議是第一個鏈路追蹤協(xié)議,這里重點講述 B3 傳播協(xié)議相關內容。

B3 有兩種編碼:Single Header 和 Multiple Header。

  • 多個標頭編碼 X-B3-在跟蹤上下文中使用每個項目的前綴標頭
  • 單個標頭將上下文分隔為一個名為 b3. 提取字段時,單頭變體優(yōu)先于多頭變體。

這是一個使用多個標頭編碼的示例流程,假設 HTTP 請求帶有傳播的跟蹤:

在這里插入圖片描述

Multiple Headers

需要配合多個 header key 使用。

TraceId

X-B3-TraceId 標頭編碼為 32 或 16 個低十六進制字符。例如,128 位 TraceId 標頭:X-B3-TraceId:463ac35c9f6413ad48485a3953bb6124。除非僅傳播“采樣狀態(tài)”,否則需要 X-B3-TraceId 標頭。

SpanId

X-B3-SpanId 標頭編碼為16個較低的十六進制字符。例如:X-B3-SpanId:a2fb4a1d1a96d312。除非僅傳播“采樣狀態(tài)”,否則需要 X-B3-SpanId 標頭。

ParentSpanId

X-B3-ParentSpanId標頭可能存在于子跨度上,而在根跨度上必須不存在。它被編碼為16個低十六進制字符。例如,ParentSpanId標頭可能看起來像:X-B3-ParentSpanId:00020000000000001

Sampling State

接受采樣決定編碼為X-B3-Sampled:1,拒絕編碼為X-B3-Sampled:0。缺席意味著將決定推遲到該報頭的接收方。例如:X-B3-Sampled:1。

注:在編寫本規(guī)范之前,一些示蹤劑傳播X-B3-Sampledtruefalse,而不是10。雖然您不應該將X-B3-Sampled編碼為truefalse,但寬松的實現(xiàn)可能會接受它們。

Debug Flag

調試編碼為X-B3-Flags: 1??梢院雎?Absent 或任何其他值。調試意味著接受決定,所以不要同時發(fā)送X-B3-Sampled標頭。

Single Header

Single Header 只有一個header 為b3的 key 作為標記。

b3={TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}

b3: 80f198ee56343ba864fe8b2a57d3eff7-e457b5a2e4d86bd1-d

實現(xiàn)場景

目前主要有兩大實現(xiàn)場景:

  • APM:主要是服務端之間傳播
  • RUM:用戶端(web、小程序等)與服務端傳播

APM

OpenTelemetry 傳播器源碼

OpenTelemetry 傳播器源碼

傳播器接口:TextMapPropagator

opentelemetry-java 通過定義統(tǒng)一的接口TextMapPropagator來實現(xiàn)各種 Propagate。

TextMapPropagator默認提供了一個空實現(xiàn)noop()。

TextMapPropagator 定義了三個接口方法:

  • fields() : 規(guī)定了哪些字段作為傳播器識別的對象
  • inject():定義了傳播器字段注入規(guī)則
  • extract():定義傳播器字段提取規(guī)則,返回Context對象

一些廠商有自己的 APM 標準,通過擴展TextMapPropagator接口,實現(xiàn)對接廠商特定的傳播器。

@ThreadSafe
public interface TextMapPropagator {static TextMapPropagator composite(TextMapPropagator... propagators) {return composite(Arrays.asList(propagators));}static TextMapPropagator composite(Iterable<TextMapPropagator> propagators) {List<TextMapPropagator> propagatorsList = new ArrayList<>();for (TextMapPropagator propagator : propagators) {propagatorsList.add(propagator);}if (propagatorsList.isEmpty()) {return NoopTextMapPropagator.getInstance();}if (propagatorsList.size() == 1) {return propagatorsList.get(0);}return new MultiTextMapPropagator(propagatorsList);}static TextMapPropagator noop() {return NoopTextMapPropagator.getInstance();}Collection<String> fields();<C> void inject(Context context, @Nullable C carrier, TextMapSetter<C> setter);<C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C> getter);
}

OtTracePropagator

OtTracePropagator 是 OpenTelemetry 特有的傳播器,識別解析ot-開頭的header,部分源碼如下:

@Immutable
public final class OtTracePropagator implements TextMapPropagator {static final String TRACE_ID_HEADER = "ot-tracer-traceid";static final String SPAN_ID_HEADER = "ot-tracer-spanid";static final String SAMPLED_HEADER = "ot-tracer-sampled";static final String PREFIX_BAGGAGE_HEADER = "ot-baggage-";private static final Collection<String> FIELDS =Collections.unmodifiableList(Arrays.asList(TRACE_ID_HEADER, SPAN_ID_HEADER, SAMPLED_HEADER));....@Overridepublic Collection<String> fields() {return FIELDS;}@Overridepublic <C> void inject(Context context, @Nullable C carrier, TextMapSetter<C> setter) {if (context == null || setter == null) {return;}SpanContext spanContext = Span.fromContext(context).getSpanContext();if (!spanContext.isValid()) {return;}// Lightstep trace id MUST be 64-bits therefore OpenTelemetry trace id is truncated to 64-bits// by retaining least significant (right-most) bits.setter.set(carrier, TRACE_ID_HEADER, spanContext.getTraceId().substring(TraceId.getLength() / 2));setter.set(carrier, SPAN_ID_HEADER, spanContext.getSpanId());setter.set(carrier, SAMPLED_HEADER, String.valueOf(spanContext.isSampled()));// Baggage is only injected if there is a valid SpanContextBaggage baggage = Baggage.fromContext(context);if (!baggage.isEmpty()) {// Metadata is not supported by OpenTracingbaggage.forEach((key, baggageEntry) ->setter.set(carrier, PREFIX_BAGGAGE_HEADER + key, baggageEntry.getValue()));}}@Overridepublic <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C> getter) {if (context == null) {return Context.root();}if (getter == null) {return context;}String incomingTraceId = getter.get(carrier, TRACE_ID_HEADER);String traceId =incomingTraceId == null? TraceId.getInvalid(): StringUtils.padLeft(incomingTraceId, MAX_TRACE_ID_LENGTH);String spanId = getter.get(carrier, SPAN_ID_HEADER);String sampled = getter.get(carrier, SAMPLED_HEADER);SpanContext spanContext = buildSpanContext(traceId, spanId, sampled);if (!spanContext.isValid()) {return context;}Context extractedContext = context.with(Span.wrap(spanContext));// Baggage is only extracted if there is a valid SpanContextif (carrier != null) {BaggageBuilder baggageBuilder = Baggage.builder();for (String key : getter.keys(carrier)) {if (!key.startsWith(PREFIX_BAGGAGE_HEADER)) {continue;}String value = getter.get(carrier, key);if (value == null) {continue;}baggageBuilder.put(key.replace(OtTracePropagator.PREFIX_BAGGAGE_HEADER, ""), value);}Baggage baggage = baggageBuilder.build();if (!baggage.isEmpty()) {extractedContext = extractedContext.with(baggage);}}return extractedContext;}...
}

初始化傳播器

opentelemetry-java 通過PropagatorConfiguration 對象對Propagate進行初始化操作,源碼如下:


final class PropagatorConfiguration {private static final List<String> DEFAULT_PROPAGATORS = Arrays.asList("tracecontext", "baggage");static ContextPropagators configurePropagators(ConfigProperties config,ClassLoader serviceClassLoader,BiFunction<? super TextMapPropagator, ConfigProperties, ? extends TextMapPropagator>propagatorCustomizer) {Set<TextMapPropagator> propagators = new LinkedHashSet<>();List<String> requestedPropagators = config.getList("otel.propagators", DEFAULT_PROPAGATORS);NamedSpiManager<TextMapPropagator> spiPropagatorsManager =SpiUtil.loadConfigurable(ConfigurablePropagatorProvider.class,ConfigurablePropagatorProvider::getName,ConfigurablePropagatorProvider::getPropagator,config,serviceClassLoader);if (requestedPropagators.contains("none")) {if (requestedPropagators.size() > 1) {throw new ConfigurationException("otel.propagators contains 'none' along with other propagators");}return ContextPropagators.noop();}for (String propagatorName : requestedPropagators) {propagators.add(propagatorCustomizer.apply(getPropagator(propagatorName, spiPropagatorsManager), config));}return ContextPropagators.create(TextMapPropagator.composite(propagators));}private static TextMapPropagator getPropagator(String name, NamedSpiManager<TextMapPropagator> spiPropagatorsManager) {if (name.equals("tracecontext")) {return W3CTraceContextPropagator.getInstance();}if (name.equals("baggage")) {return W3CBaggagePropagator.getInstance();}TextMapPropagator spiPropagator = spiPropagatorsManager.getByName(name);if (spiPropagator != null) {return spiPropagator;}throw new ConfigurationException("Unrecognized value for otel.propagators: "+ name+ ". Make sure the artifact including the propagator is on the classpath.");}private PropagatorConfiguration() {}
}

啟動 agent 時,通過指定傳播器類型來實現(xiàn)對應實例構造,通過方法得知,otel 支持同時指定多種類型的傳播器協(xié)議,默認采用tracecontext傳播器——即w3c標準的傳播器:
List<String> requestedPropagators = config.getList("otel.propagators", DEFAULT_PROPAGATORS);

獲取傳播器

opentelemetry-java 通過OpenTelemetry對象的propagating()方法構造當前支持的傳播器,且通過getPropagators()方法來獲取已有的傳播器,OpenTelemetry是一個接口類,部分代碼如下:

public interface OpenTelemetry {static OpenTelemetry noop() {return DefaultOpenTelemetry.getNoop();}static OpenTelemetry propagating(ContextPropagators propagators) {return DefaultOpenTelemetry.getPropagating(propagators);}TracerProvider getTracerProvider();ContextPropagators getPropagators();...
}

每一個Instrumente都需要通過InstrumenterBuilder獲取OpenTelemetry 對象來實現(xiàn) trace、metric 相關業(yè)務邏輯。比如,啟動一個 span。

如何獲取OpenTelemetry對象

通過上面的研究,我們知道如何獲取傳播器,但是獲取傳播器需要獲取OpenTelemetry對象,opentelemetry-java提供了一個全局的對象GlobalOpenTelemetry來獲取OpenTelemetry對象。我們來看看具體代碼

public final class GlobalOpenTelemetry {
...@Nullableprivate static volatile ObfuscatedOpenTelemetry globalOpenTelemetry;public static OpenTelemetry get() {OpenTelemetry openTelemetry = globalOpenTelemetry;if (openTelemetry == null) {synchronized(mutex) {openTelemetry = globalOpenTelemetry;if (openTelemetry == null) {OpenTelemetry autoConfigured = maybeAutoConfigureAndSetGlobal();if (autoConfigured != null) {return autoConfigured;}set(OpenTelemetry.noop());return OpenTelemetry.noop();}}}return openTelemetry;}public static void set(OpenTelemetry openTelemetry) {synchronized(mutex) {if (globalOpenTelemetry != null) {throw new IllegalStateException("GlobalOpenTelemetry.set has already been called. GlobalOpenTelemetry.set must be called only once before any calls to GlobalOpenTelemetry.get. If you are using the OpenTelemetrySdk, use OpenTelemetrySdkBuilder.buildAndRegisterGlobal instead. Previous invocation set to cause of this exception.", setGlobalCaller);} else {globalOpenTelemetry = new ObfuscatedOpenTelemetry(openTelemetry);setGlobalCaller = new Throwable();}}}@Nullableprivate static OpenTelemetry maybeAutoConfigureAndSetGlobal() {Class openTelemetrySdkAutoConfiguration;try {openTelemetrySdkAutoConfiguration = Class.forName("io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk");} catch (ClassNotFoundException var7) {return null;}boolean globalAutoconfigureEnabled = Boolean.parseBoolean(ConfigUtil.getString("otel.java.global-autoconfigure.enabled", "false"));if (!globalAutoconfigureEnabled) {logger.log(Level.INFO, "AutoConfiguredOpenTelemetrySdk found on classpath but automatic configuration is disabled. To enable, run your JVM with -Dotel.java.global-autoconfigure.enabled=true");return null;} else {try {Method initialize = openTelemetrySdkAutoConfiguration.getMethod("initialize");Object autoConfiguredSdk = initialize.invoke((Object)null);Method getOpenTelemetrySdk = openTelemetrySdkAutoConfiguration.getMethod("getOpenTelemetrySdk");return new ObfuscatedOpenTelemetry((OpenTelemetry)getOpenTelemetrySdk.invoke(autoConfiguredSdk));} catch (IllegalAccessException | NoSuchMethodException var5) {throw new IllegalStateException("AutoConfiguredOpenTelemetrySdk detected on classpath but could not invoke initialize method. This is a bug in OpenTelemetry.", var5);} catch (InvocationTargetException var6) {logger.log(Level.SEVERE, "Error automatically configuring OpenTelemetry SDK. OpenTelemetry will not be enabled.", var6.getTargetException());return null;}}}...

GlobalOpenTelemetry 通過單例模式實現(xiàn)獲取全局OpenTelemetry對象。而OpenTelemetry則主要是通過AutoConfiguredOpenTelemetrySdkgetOpenTelemetrySdk方法初始化構建。

至此,基本上完成了opentelemetry-java從傳播器實現(xiàn)、構造、初始化及獲取相關操作。

DataDog(DDtrace)傳播器源碼

DataDog(DDtrace)傳播器源碼

DDtrace除了支持上面表格中的傳播協(xié)議之外,還支持其他傳播協(xié)議,如:

  • Haystack
    • Haystack-Trace-ID
    • Haystack-Span-ID
    • Haystack-Parent-ID
  • XRAY
    • X-Amzn-Trace-Id

RUM

前面了解了傳播器的原理、作用以及實現(xiàn)方式。傳播器提到最多的是 header,也就說大多數(shù)都是基于 http 協(xié)議?;?http 協(xié)議,進一步引申到 html、小程序、Android、iOS 等,從而引出另一個概念:RUM。

RUM 全稱為 Real User Monitor,即真實用戶監(jiān)控。

RUM 通過實現(xiàn)不同的傳播器協(xié)議,將用戶端與服務端緊密聯(lián)系在一起,我們知道 APM 是后端接口及服務的性能表現(xiàn),但接口用于地方很多,有的來源于 web,有的來源于小程序等等。通過引入 RUM,結合鏈路分析,很容易追蹤到數(shù)據來源于哪一端。

當然 RUM 的作用不僅僅是這一方面,目前市面上常見的是基于 W3C(萬維網聯(lián)盟)定義的[navigation-timing] 標準(見下圖),該標準詳細定義了各種瀏覽器事件,通過瀏覽器事件的簡單計算就可以算出來前端頁面的首屏、白屏、DOM 加載、HTML 加載等時長,相較于測試環(huán)境的 F12 檢查者模式,能有更效的收集生產環(huán)境真實用戶的前端體驗。

在這里插入圖片描述

opentelemetry-js

opentelemetry-js是 OpenTelemetry 具體的實現(xiàn),目前支持 nodejs 和 js,作用范圍比較有限,主要圍繞 OpenTelemetry 的集中傳播器協(xié)議實現(xiàn),產品成熟度仍需進一步提升。

opentelemetry-js demo

觀測云 RUM

是觀測云推出的 RUM 產品,可以與多種 APM 技術融合,本質上是支持多種傳播器協(xié)議,進而能夠與各種 APM 結合使用。

支持的傳播器協(xié)議有:

  • ddtrace :x-datadog-parent-id,x-datadog-sampled,x-datadog-sampling-priority,x-datadog-trace-id。
  • skywalking: sw8。
  • jaeger: uber-trace-id。
  • zipkin: X-B3-TraceId、X-B3-SpanId、X-B3-ParentSpanId、X-B3-Sampled、X-B3-Flags。
  • zipkin_single_header: b3。
  • w3c_traceparent: traceparent。
  • opentelemetry: 該類型支持 zipkin_single_header,w3c_traceparent,zipkin、jaeger三種類型的配置方式,根據在 rum sdk 中配置的 traceType 類型 添加對應的 header。

目前支持的應用有:

  • web H5
  • 小程序
  • Android
  • iOS
  • React Native
  • Flutter
  • UniApp
  • C++

以 web 為例,展示接入方式,接入簡單。

<script src="https://static.guance.com/browser-sdk/v3/dataflux-rum.js" type="text/javascript"></script>
<script>window.DATAFLUX_RUM &&window.DATAFLUX_RUM.init({applicationId: '<應用 ID>',datakitOrigin: '<DATAKIT ORIGIN>', // 協(xié)議(包括://),域名(或IP地址)[和端口號]env: 'production',version: '1.0.0',service: 'browser',sessionSampleRate: 100,sessionReplaySampleRate: 70,trackInteractions: true,traceType: 'ddtrace', // 非必填,默認為ddtrace,目前支持 ddtrace、zipkin、skywalking_v3、jaeger、zipkin_single_header、w3c_traceparent 6種類型allowedTracingOrigins: ['https://api.example.com',/https:\/\/.*\.my-api-domain\.com/],  // 非必填,允許注入trace采集器所需header頭部的所有請求列表??梢允钦埱蟮膐rigin,也可以是是正則})
</script>

其中 traceType 為傳播器協(xié)議。

通過 CDN 加速緩存,以同步腳本引入的方式引入 SDK,此方式可以確保能夠收集到所有的錯誤,資源,請求,性能指標,不過可能會影響頁面的加載性能。
單頁應用建議將下方代碼復制粘貼到 html 文件 head 標簽的首行,多頁應用建議將下方代碼復制粘貼到公共 head 模版文件的首行。

更多更詳細接入方式,參考官方文檔用戶訪問監(jiān)測

RUM 與 APM 實際應用

以某開源平臺訪問用戶資源為例,查看實際應用場景,如下圖所示:

在這里插入圖片描述

右側服務列表:

  • browser :瀏覽器鏈路,由RUM端上報
  • 其他服務為 APM 上報

RUM 通過傳遞特定的 header 信息,將鏈路信息傳遞給 APM,APM 正確解析相關傳播協(xié)議,并以 RUM 傳遞的 trace為基準,創(chuàng)建 span信息,實現(xiàn)前后端串聯(lián)。
browser同時可以查看當前用戶的請求耗時分布(128.3 ms)
通過右上角view 按鈕,可以跳轉到當前頁面的查看器,以此來查看分析用戶行為。如下圖所示

在這里插入圖片描述

Baggage

前面已經分析了傳播器一般需要攜帶的參數(shù)信息,便于前后端的應用串聯(lián),但實際上這只是傳播器的基礎用法,通常都是用于傳遞 trace 信息,實際上,在上面 opentelemetry-java 源碼分析中,有一個頻繁出現(xiàn)的單詞baggagebaggage主要作用于業(yè)務參數(shù)的傳遞。
通常,研發(fā)人員不會直接在接口上填上用戶信息,所以無法準確追蹤這個接口是哪個用戶觸發(fā)的,借助 baggage,通過 header 進行傳遞,能夠在服務間無限傳遞下去。

OpenTelemetry Baggage 用法

Header key 以ot-baggage- 開頭的參數(shù),會被 OpenTelemetry 一直傳遞下去。

還可以采用sdk的方式:OpenTelemetry Baggage SDK用法

DataDog Baggage 用法

需要配置啟動參數(shù)dd.trace.header.baggage,設置哪些header 作為傳遞的參數(shù)依據。用法如下:

Environment Variable: DD_TRACE_HEADER_BAGGAGE
Default: null
Example: CASE-insensitive-Header:my-baggage-name,User-ID:userId,My-Header-And-Baggage-Name
Accepts a map of case-insensitive header keys to baggage keys and automatically applies matching request header values as baggage on traces. On propagation the reverse mapping is applied: Baggage is mapped to headers.
Available since version 1.3.0.

也可以采用 SDK 的方式:DataDog Baggage SDK 用法

http://www.risenshineclean.com/news/39995.html

相關文章:

  • 做界面網站用什么語言seo教程
  • 青海住房與建設廳網站廣東網約車漲價
  • 用dw做淘客網站的步驟南京百度推廣開戶
  • 工控做網站網站免費軟件
  • 做企業(yè)網站注意些啥百度指數(shù)數(shù)據分析平臺官網
  • 專門做圖片的網站有哪些今日軍事新聞
  • 網站建設銷售實習服務營銷策劃方案
  • php網站微信支付怎么做黃頁引流推廣網站
  • 網站圖片計時器怎么做國內時事新聞
  • 網站建設昆明色盲
  • 怎么查看網站的友情鏈接外鏈發(fā)布工具
  • 哪家做網站公司好搜索大全引擎地址
  • 免費視頻網站制作愛上鏈外鏈購買平臺
  • 網站建設與維護模擬一新聞頭條免費下載安裝
  • 返利網站程序產品推廣
  • 北京網站制作西安西安網紅
  • 做網站和web前端一樣嗎百度seo優(yōu)化招聘
  • 成都網站建設贏展成都網站建設方案推廣
  • 網站建設預付款比例惠州網絡營銷
  • 成都廣告公司網站建設瑞金網絡推廣
  • 邯鄲網站建設公司群站優(yōu)化之鏈輪模式
  • 企業(yè)商務網站建設策劃書查詢域名注冊信息
  • 17網站一起做網店揭陽seo合作
  • wordpress自定義登陸頁面天津seo方案
  • 用表格做網站廊坊首頁霸屏優(yōu)化
  • 網站建設要求百度指數(shù)疫情
  • wordpress網站設計作業(yè)線下營銷推廣方式都有哪些
  • logosc網站怎么做的網絡營銷的基本特征有哪七個
  • 長沙建設公司網站網絡推廣產品公司
  • 小游戲網站審核怎么做百度信息