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

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站開發(fā)軟件培訓(xùn)企業(yè)網(wǎng)站建設(shè)方案論文

網(wǎng)站開發(fā)軟件培訓(xùn),企業(yè)網(wǎng)站建設(shè)方案論文,愛站關(guān)鍵詞,做網(wǎng)站找外包公司要要搞清楚什么作者:逸陵 背景 在云原生可觀測(cè)蓬勃發(fā)展的當(dāng)下,想必大家對(duì) OpenTelemetry & Prometheus 并不是太陌生。OpenTelemetry 是 CNCF(Cloud Native Computing Foundation)旗下的開源項(xiàng)目,它的目標(biāo)是在云原生時(shí)代成為應(yīng)…

作者:逸陵

背景

在云原生可觀測(cè)蓬勃發(fā)展的當(dāng)下,想必大家對(duì) OpenTelemetry & Prometheus 并不是太陌生。OpenTelemetry 是 CNCF(Cloud Native Computing Foundation)旗下的開源項(xiàng)目,它的目標(biāo)是在云原生時(shí)代成為應(yīng)用性能監(jiān)控領(lǐng)域的事實(shí)標(biāo)準(zhǔn),它提供了一套統(tǒng)一的 API 和 SDK,用于生成、收集和處理分布式系統(tǒng)的遙測(cè)數(shù)據(jù)??偠灾?#xff0c;OpenTelemetry 是一套觀察性的標(biāo)準(zhǔn),具有語言無關(guān)性,支持各種編程語言和框架,并可與多種觀察平臺(tái)集成。

而 Prometheus 作為目前最受歡迎的開源監(jiān)控系統(tǒng),并且已經(jīng)被 Kubernetes、Envoy 等廣泛使用的云原生項(xiàng)目所采用。雖然 Prometheus 的查詢語言十分強(qiáng)大,但是其數(shù)據(jù)格式還是 Prometheus 自己定義的。因此,它只能與 Prometheus 服務(wù)器集成,不能與其他系統(tǒng)集成。

而 OpenTelemetry 承諾在 Trace、Log 和 Metric 之間創(chuàng)建一個(gè)統(tǒng)一標(biāo)準(zhǔn),所以它的數(shù)據(jù)格式是統(tǒng)一的,并具有足夠的靈活性與交互性,同時(shí)完全兼容 Prometheus,所以吸引越來越多的開發(fā)運(yùn)維人員使用 OpenTelemetry 在承載 Trace & Log 同時(shí)將其用于 Metric 的統(tǒng)計(jì),與 Prometheus 生態(tài)進(jìn)行結(jié)合,實(shí)現(xiàn)更好的觀測(cè)監(jiān)控。

圖片

本文以構(gòu)建系統(tǒng)可觀測(cè)(重點(diǎn)為指標(biāo)監(jiān)控體系)為切入點(diǎn),對(duì)比 OpenTelemetry 與 Prometheus 的相同與差異,粗淺的談下個(gè)人選擇的一些觀點(diǎn)與看法;后重點(diǎn)介紹如何將應(yīng)用的 OpenTelemetry 指標(biāo)接入 Prometheus 及背后原理,最后介紹阿里云可觀測(cè)監(jiān)控 Prometheus 版擁抱 OpenTelemetry 及相關(guān)落地實(shí)踐案例,希望能更好的幫助讀者更好的理解 OpenTelemetry 及與 Prometheus 的生態(tài)融合。

站在 OpenTelemetry 與 Prometheus 的十字路口

如果你作為研發(fā)運(yùn)維人員在進(jìn)行系統(tǒng)觀測(cè)時(shí),特別是構(gòu)建指標(biāo)監(jiān)控體系時(shí),會(huì)有很多困惑,到底選擇 OpenTelemetry 還是 Prometheus。在回答這個(gè)問題之前我們首先需要明確的了解 OpenTelemetry 與 Prometheus 的同異。

圖片

而在對(duì)比之前,我們還是有必要對(duì) OpenTelemetry 的指標(biāo)模型進(jìn)行深入的介紹。

2.1?OpenTelemetry 指標(biāo)模型介紹

OpenTelemetry 將指標(biāo)分解為三個(gè)交互模型,事件模型、Timeseries 模型以及指標(biāo)(Metric)流模型。其中事件模型表示儀器如何報(bào)告指標(biāo)數(shù)據(jù);Timeseries 模型表示后端如何存儲(chǔ)指標(biāo)數(shù)據(jù);指標(biāo)(Metric)流模型定義 OpenTelemetry 協(xié)議 (OTLP),表示如何在事件模型和時(shí)間序列存儲(chǔ)之間操作和傳輸指標(biāo)數(shù)據(jù)流。

2.1.1?事件模型

事件模型是數(shù)據(jù)記錄發(fā)生的地方,它的基礎(chǔ)由 Instruments [ 1] 組成,Instruments 用于通過事件記錄可觀測(cè)數(shù)據(jù)。然后,這些原始事件在發(fā)送到其他系統(tǒng)之前以某種方式進(jìn)行轉(zhuǎn)換。OpenTelemetry 指標(biāo)的設(shè)計(jì)使得使用相同的 Instruments 和事件使用不同的方式來生成 metric 指標(biāo)流。

圖片

盡管觀測(cè)事件可以直接報(bào)告給后端,但實(shí)際上這是不可行的,因?yàn)榭捎^測(cè)系統(tǒng)中使用的數(shù)據(jù)量巨大,并且可用于遙測(cè)收集目的的網(wǎng)絡(luò)/CPU 資源有限,最好的例子是直方圖指標(biāo),其中原始事件以壓縮格式而不是單個(gè)時(shí)間序列記錄。

注意:上圖顯示了一個(gè) Instrument 如何將事件轉(zhuǎn)換為多種類型的指標(biāo)流。

2.1.2?時(shí)間序列模型

在 low-level 指標(biāo)數(shù)據(jù)模型中,時(shí)間序列是由多個(gè)元數(shù)據(jù)屬性組成的實(shí)體定義:

  • 指標(biāo)名稱
  • 屬性(維度)
  • 點(diǎn)的值類型(整數(shù)、浮點(diǎn)數(shù)等)
  • 測(cè)量單位

每個(gè)時(shí)間序列的原始數(shù)據(jù)都是有序的(時(shí)間戳,值)點(diǎn),其值類型如下:

  • Counter
  • Gauge
  • Histogram
  • Exponential Histogram
2.1.3?OpenTelemetry 協(xié)議數(shù)據(jù)模型

OpenTelemetry 協(xié)議(OTLP)數(shù)據(jù)模型由 Metric 數(shù)據(jù)流組成,這些流又由度量數(shù)據(jù)點(diǎn)組成,指標(biāo)數(shù)據(jù)流可以直接轉(zhuǎn)換為時(shí)間序列。指標(biāo)流被分組為單獨(dú)的指標(biāo)對(duì)象,通過以下方式標(biāo)識(shí):

  • 原始 Resource 屬性
  • Instrumentation Scope(例如 instrumentation lib 名稱、版本)
  • 指標(biāo)流的 name

包括 name 在內(nèi),Metric 對(duì)象由以下屬性定義:

  • 數(shù)據(jù)點(diǎn)類型(例如?Sum、Gauge、Histogram、ExponentialHistogram、Summary)
  • 指標(biāo)流的單位(unit)
  • 指標(biāo)流的描述(description)
  • 內(nèi)部數(shù)據(jù)點(diǎn)屬性(如果適用):AggregationTemporality、Monotonic

數(shù)據(jù)點(diǎn)類型、單位和內(nèi)在屬性被認(rèn)為是識(shí)別性的,而描述字段本質(zhì)上不具備識(shí)別性。特定點(diǎn)的外在屬性不被視為識(shí)別;這些包括但不限于:

  • 直方圖(Histogram)數(shù)據(jù)點(diǎn)的桶邊界
  • 指數(shù)直方圖(ExponentialHistogram)數(shù)據(jù)點(diǎn)的大小或桶數(shù)量

Metric 對(duì)象包含不同流,由 Attributes 標(biāo)識(shí)。在各個(gè)流中,點(diǎn)由一個(gè)或者兩個(gè)時(shí)間戳標(biāo)識(shí),詳細(xì)信息因數(shù)據(jù)點(diǎn)類型而異。

2.1.4?點(diǎn)類型介紹
2.1.4.1?Sum

OTLP 中的 Sums [ 2] 由以下部分組成:

  1. 增量(delta)或累積(cumulative)的 Aggregation Temporality。2. 一個(gè)表示 Sum 是否單調(diào)(monotonic [ 3] )的標(biāo)志。
  • 對(duì)于增量單調(diào)(delta monotonic) Sums,這意味著讀者應(yīng)該期望非負(fù)值
  • 對(duì)于累積單調(diào)(cumulative monotonic) Sums,這意味著讀者應(yīng)該期望不小于先前值的值

一組數(shù)據(jù)點(diǎn),每個(gè)數(shù)據(jù)點(diǎn)包含:

  • 一組獨(dú)立的屬性名稱-值對(duì)
  • 計(jì)算 Sum 的時(shí)間窗口
  • (可選)一組 examplars [ 4]

當(dāng)聚合時(shí)間性為"delta"時(shí),我們期望度量流的時(shí)間窗口沒有重疊,如下圖所示:

圖片

而當(dāng)與聚合時(shí)間性為"cumulative"的時(shí)候,我們期望報(bào)告自“開始”以來的全部總和(其中通常開始意味著進(jìn)程/應(yīng)用程序啟動(dòng))。

圖片

在各種用例中,使用 Delta 與累積聚合之間存在各種權(quán)衡,例如:

  • 檢測(cè)進(jìn)程重新啟動(dòng)
  • 計(jì)算 rate
  • 基于推與拉的指標(biāo)報(bào)告

OTLP 支持這兩種模型,并允許 API、SDK 和用戶在其各自的場(chǎng)景中確定最佳的折衷方案。

2.1.4.2?Gauge

OTLP 中的 Gauge [ 5] 表示給定時(shí)間的采樣值。Gauge 流包括一組數(shù)據(jù)點(diǎn),每個(gè)數(shù)據(jù)點(diǎn)包含:

  • 一組獨(dú)立的屬性名稱-值對(duì)
  • 采樣值(例如當(dāng)前 CPU 溫度)
  • 對(duì)值進(jìn)行采樣時(shí)的時(shí)間戳(time_unix_nano)
  • (可選)時(shí)間戳(start_time_unix_nano),它最能代表可以記錄測(cè)量的第一個(gè)可能時(shí)刻,這通常設(shè)置為指標(biāo)收集系統(tǒng)啟動(dòng)時(shí)的時(shí)間戳
  • (可選)一組 examplars

在 OTLP 中,Gauge 流中的點(diǎn)表示給定時(shí)間窗口的最后采樣事件。

圖片

在此示例中,我們可以看到我們使用 Gauge 采樣的基礎(chǔ)時(shí)間序列,雖然事件模型可以在給定的指標(biāo)報(bào)告間隔內(nèi)多次采樣,但通過 OTLP 在指標(biāo)流中僅報(bào)告最后一個(gè)值。

Gauge 不提供聚合語義,而是在執(zhí)行時(shí)間對(duì)齊或調(diào)整分辨率等操作時(shí)使用“最后一個(gè)樣本值”。可以通過轉(zhuǎn)換為直方圖或其他度量類型來聚合 Gauge。這些操作默認(rèn)情況下不執(zhí)行,需要用戶直接配置。

2.1.4.3?Histogram

Histogram [ 6] 度量數(shù)據(jù)點(diǎn)以壓縮格式傳達(dá)大量記錄的測(cè)量結(jié)果。直方圖將一組事件分為為多個(gè)群體,并提供總體事件計(jì)數(shù)和所有事件的總和。

圖片

直方圖 Histogram 由以下部分組成:

  1. 增量(delta)或累積(cumulative)的 Aggregation Temporality2. 一組數(shù)據(jù)點(diǎn),每個(gè)數(shù)據(jù)點(diǎn)包含:
  • 一組獨(dú)立的屬性名稱-值對(duì)
  • 捆綁直方圖的時(shí)間窗口((start, end])
  • 直方圖中點(diǎn)總數(shù)的計(jì)數(shù)(count)
  • 直方圖中所有值的總和(sum)
  • (可選)直方圖中所有值的最小值(min)
  • (可選)直方圖中所有值的最大值(max)
  • (可選)一系列桶:明確的邊界值,這些值表示存儲(chǔ)桶的下限和上限,以及是否將給定的觀察結(jié)果記錄在該存儲(chǔ)桶中;屬于該存儲(chǔ)桶的觀測(cè)值數(shù)量的計(jì)數(shù)。
  • (可選)一組 examplars

與 Sums 一樣,直方圖也定義聚合時(shí)間性。上圖表示 Delta 時(shí)間性,其中累積的事件計(jì)數(shù)在報(bào)告后重置為零,并發(fā)生新的聚合。另一方面,累積繼續(xù)聚合事件,并使用新的開始時(shí)間進(jìn)行重置。聚合時(shí)間性 Aggregation Temporality 也對(duì)最小和最大字段有影響,最小值和最大值對(duì)于增量時(shí)間性(Delta)更有用,因?yàn)殡S著記錄更多事件,累積最小值和最大值表示的值將穩(wěn)定。此外,可以將最小值和最大值從 Delta 轉(zhuǎn)換為 Cumulative,但不能從 Cumulative 轉(zhuǎn)換為 Delta。從累積轉(zhuǎn)換為增量時(shí),可以刪除最小值和最大值,或者以替代表示形式(例如儀表)捕獲最小值和最大值。

桶數(shù)是可選的。沒有桶的直方圖僅根據(jù)總和和計(jì)數(shù)來傳達(dá)總體,并且可以解釋為具有單桶覆蓋的直方圖(-Inf,+Inf),如下為 Cumulative 型 Histogram 樣例數(shù)據(jù)。

2023-11-29T13:43:45.238Z  info  ResourceMetrics #0
Resource SchemaURL: 
Resource attributes:-> service.name: Str(opentelemetry-metric-demo-delta-or-cumulative)-> service.version: Str(0.0.1)-> telemetry.sdk.language: Str(java)-> telemetry.sdk.name: Str(opentelemetry)-> telemetry.sdk.version: Str(1.29.0)
ScopeMetrics #0
ScopeMetrics SchemaURL: 
InstrumentationScope aliyun 
Metric #0
Descriptor:-> Name: cumulative_long_histogram-> Description: ot cumulative demo cumulative_long_histogram-> Unit: ms-> DataType: Histogram-> AggregationTemporality: Cumulative
HistogramDataPoints #0
StartTimestamp: 2023-11-29 13:43:15.181 +0000 UTC
Timestamp: 2023-11-29 13:43:45.182 +0000 UTC
Count: 2
Sum: 141.000000
Min: 62.000000
Max: 79.000000
ExplicitBounds #0: 0.000000
ExplicitBounds #1: 5.000000
ExplicitBounds #2: 10.000000
ExplicitBounds #3: 25.000000
ExplicitBounds #4: 50.000000
ExplicitBounds #5: 75.000000
ExplicitBounds #6: 100.000000
ExplicitBounds #7: 250.000000
ExplicitBounds #8: 500.000000
ExplicitBounds #9: 750.000000
ExplicitBounds #10: 1000.000000
ExplicitBounds #11: 2500.000000
ExplicitBounds #12: 5000.000000
ExplicitBounds #13: 7500.000000
ExplicitBounds #14: 10000.000000
Buckets #0, Count: 0
Buckets #1, Count: 0
Buckets #2, Count: 0
Buckets #3, Count: 0
Buckets #4, Count: 0
Buckets #5, Count: 1
Buckets #6, Count: 1
Buckets #7, Count: 0
Buckets #8, Count: 0
Buckets #9, Count: 0
Buckets #10, Count: 0
Buckets #11, Count: 0
Buckets #12, Count: 0
Buckets #13, Count: 0
Buckets #14, Count: 0
Buckets #15, Count: 0
2.1.4.4?ExponentialHistogram

指數(shù)直方圖數(shù)據(jù)點(diǎn)是直方圖數(shù)據(jù)點(diǎn)的替代表示形式,用于以壓縮格式傳達(dá)一組記錄的測(cè)量值。ExponentialHistogram 使用指數(shù)公式壓縮桶邊界,與類似大小的替代表示相比,使其適合以較小的相對(duì)誤差傳輸高動(dòng)態(tài)范圍數(shù)據(jù)。

直方圖 Histogram 涉及聚合時(shí)間性、屬性和時(shí)間戳以及 sum、count、min、max 和 exemplars 字段,ExponentialHistogram 與 Histogram 類似,這些字段都與直方圖 Histogram 具有相同的解釋,只是這兩種類型之間的存儲(chǔ) bucket 結(jié)構(gòu)不同。如下為一個(gè) delta 形式的 ExponentialHistogram 數(shù)據(jù)格式:

2023-11-29T13:13:09.866Z  info  ResourceMetrics #0
Resource SchemaURL: 
Resource attributes:-> service.name: Str(opentelemetry-metric-demo-delta-or-cumulative)-> service.version: Str(0.0.1)-> telemetry.sdk.language: Str(java)-> telemetry.sdk.name: Str(opentelemetry)-> telemetry.sdk.version: Str(1.29.0)
ScopeMetrics #0
ScopeMetrics SchemaURL: 
InstrumentationScope aliyun 
Metric #0
Descriptor:-> Name: cumulative_long_e_histogram-> Description: ot cumulative demo cumulative_long_e_histogram-> Unit: ms-> DataType: ExponentialHistogram-> AggregationTemporality: Cumulative
ExponentialHistogramDataPoints #0
StartTimestamp: 2023-11-29 13:11:54.858 +0000 UTC
Timestamp: 2023-11-29 13:13:09.86 +0000 UTC
Count: 3
Sum: 191.000000
Min: 15.000000
Max: 89.000000
Bucket (14.993341, 15.321652], Count: 1
Bucket (15.321652, 15.657153], Count: 0
Bucket (15.657153, 16.000000], Count: 0
Bucket (16.000000, 16.350354], Count: 0
Bucket (16.350354, 16.708381], Count: 0
Bucket (16.708381, 17.074246], Count: 0
Bucket (17.074246, 17.448124], Count: 0
Bucket (17.448124, 17.830188], Count: 0
Bucket (17.830188, 18.220618], Count: 0
Bucket (18.220618, 18.619598], Count: 0
Bucket (18.619598, 19.027314], Count: 0
Bucket (19.027314, 19.443958], Count: 0
Bucket (19.443958, 19.869725], Count: 0
Bucket (19.869725, 20.304815], Count: 0
Bucket (20.304815, 20.749433], Count: 0
Bucket (20.749433, 21.203786], Count: 0
Bucket (21.203786, 21.668089], Count: 0
Bucket (21.668089, 22.142558], Count: 0
Bucket (22.142558, 22.627417], Count: 0
Bucket (22.627417, 23.122893], Count: 0
Bucket (23.122893, 23.629218], Count: 0
Bucket (23.629218, 24.146631], Count: 0
Bucket (24.146631, 24.675373], Count: 0
Bucket (24.675373, 25.215694], Count: 0
Bucket (25.215694, 25.767845], Count: 0
Bucket (25.767845, 26.332088], Count: 0
Bucket (26.332088, 26.908685], Count: 0
Bucket (26.908685, 27.497909], Count: 0
Bucket (27.497909, 28.100035], Count: 0
Bucket (28.100035, 28.715345], Count: 0
Bucket (28.715345, 29.344129], Count: 0
Bucket (29.344129, 29.986682], Count: 0
Bucket (29.986682, 30.643305], Count: 0
Bucket (30.643305, 31.314306], Count: 0
Bucket (31.314306, 32.000000], Count: 0
Bucket (32.000000, 32.700709], Count: 0
Bucket (32.700709, 33.416761], Count: 0
Bucket (33.416761, 34.148493], Count: 0
Bucket (34.148493, 34.896247], Count: 0
Bucket (34.896247, 35.660376], Count: 0
Bucket (35.660376, 36.441236], Count: 0
Bucket (36.441236, 37.239195], Count: 0
Bucket (37.239195, 38.054628], Count: 0
Bucket (38.054628, 38.887916], Count: 0
Bucket (38.887916, 39.739450], Count: 0
Bucket (39.739450, 40.609631], Count: 0
Bucket (40.609631, 41.498866], Count: 0
Bucket (41.498866, 42.407573], Count: 0
Bucket (42.407573, 43.336178], Count: 0
Bucket (43.336178, 44.285116], Count: 0
Bucket (44.285116, 45.254834], Count: 0
Bucket (45.254834, 46.245786], Count: 0
Bucket (46.245786, 47.258437], Count: 0
Bucket (47.258437, 48.293262], Count: 0
Bucket (48.293262, 49.350746], Count: 0
Bucket (49.350746, 50.431387], Count: 0
Bucket (50.431387, 51.535691], Count: 0
Bucket (51.535691, 52.664175], Count: 0
Bucket (52.664175, 53.817371], Count: 0
Bucket (53.817371, 54.995818], Count: 0
Bucket (54.995818, 56.200069], Count: 0
Bucket (56.200069, 57.430690], Count: 0
Bucket (57.430690, 58.688259], Count: 0
Bucket (58.688259, 59.973364], Count: 0
Bucket (59.973364, 61.286610], Count: 0
Bucket (61.286610, 62.628612], Count: 0
Bucket (62.628612, 64.000000], Count: 0
Bucket (64.000000, 65.401418], Count: 0
Bucket (65.401418, 66.833522], Count: 0
Bucket (66.833522, 68.296986], Count: 0
Bucket (68.296986, 69.792495], Count: 0
Bucket (69.792495, 71.320752], Count: 0
Bucket (71.320752, 72.882473], Count: 0
Bucket (72.882473, 74.478391], Count: 0
Bucket (74.478391, 76.109255], Count: 0
Bucket (76.109255, 77.775831], Count: 0
Bucket (77.775831, 79.478900], Count: 0
Bucket (79.478900, 81.219261], Count: 0
Bucket (81.219261, 82.997731], Count: 0
Bucket (82.997731, 84.815145], Count: 0
Bucket (84.815145, 86.672355], Count: 0
Bucket (86.672355, 88.570232], Count: 1
Bucket (88.570232, 90.509668], Count: 1

2.1.4.4.1?Exponential Scale

指數(shù)直方圖的分辨率由 scale 參數(shù)來表征,scale 值越大,精度越高。指數(shù)直方圖的 bucket 邊界位于 base 的整數(shù)次冪,也稱為“增長(zhǎng)因子”,其中:

base = 2**(2**(-scale))

這些公式中的符號(hào) ** 表示求冪,因此 2**x 讀作“2 的 x 次方”,通常由 math.Pow(2.0, x) 等表達(dá)式計(jì)算,如下為 OpenTelemetry 官方中的樣例,所選 scale 的計(jì)算 base 如下所示:

圖片

該設(shè)計(jì)的一個(gè)重要屬性被描述為“完美子集”,具有給定比例的指數(shù)直方圖的桶精確地映射到具有較小比例的指數(shù)直方圖的桶中,這允許消費(fèi)者降低直方圖的分辨率(即縮小比例)而不會(huì)引入誤差。上述 delta ExponentialHistogram 數(shù)據(jù)使用默認(rèn)的 Base2ExponentialHistogramAggregation,其中 max scale 為 20。

private static final int DEFAULT_MAX_BUCKETS = 160;private static final int DEFAULT_MAX_SCALE = 20;private static final Aggregation DEFAULT = new Base2ExponentialHistogramAggregation(160, 20);private final int maxBuckets;private final int maxScale;private Base2ExponentialHistogramAggregation(int maxBuckets, int maxScale) {this.maxBuckets = maxBuckets;this.maxScale = maxScale;}public static Aggregation getDefault() {return DEFAULT;}public static Aggregation create(int maxBuckets, int maxScale) {Utils.checkArgument(maxBuckets >= 1, "maxBuckets must be > 0");Utils.checkArgument(maxScale <= 20 && maxScale >= -10, "maxScale must be -10 <= x <= 20");return new Base2ExponentialHistogramAggregation(maxBuckets, maxScale);}

2.1.4.4.2?Exponential Buckets

由索引(有符號(hào)整數(shù))標(biāo)識(shí)的指數(shù)直方圖桶表示總體中大于基數(shù)索引且小于或等于基數(shù)(索引+1)的值,直方圖的正負(fù)范圍分別表示。使用與正值范圍相同的比例,將負(fù)值按其絕對(duì)值映射到負(fù)值范圍。請(qǐng)注意,因此,在負(fù)范圍內(nèi),直方圖桶使用下限邊界。ExponentialHistogram 數(shù)據(jù)點(diǎn)的每個(gè)范圍都使用桶的密集表示,其中桶的范圍表示為單個(gè)偏移值、有符號(hào)整數(shù)和計(jì)數(shù)值數(shù)組,其中數(shù)組元素 i 表示桶索引的桶計(jì)數(shù)偏移 +i。

對(duì)于給定范圍(正數(shù)或負(fù)數(shù)):

  • 存儲(chǔ) bucket 索引 0 對(duì)范圍 (1, base] 內(nèi)的測(cè)量進(jìn)行計(jì)數(shù)
  • 正索引對(duì)應(yīng)于大于 base 的絕對(duì)值
  • 負(fù)索引對(duì)應(yīng)于絕對(duì)值小于或等于 1
  • 連續(xù)的 2 次冪之間有 2** scale 個(gè) bucket

例如,當(dāng) scale=3 時(shí),1和2之間有 2**3 個(gè)桶,請(qǐng)注意,scale=3 直方圖中存儲(chǔ)桶索引 4 的下邊界映射到 scale=2 直方圖中存儲(chǔ)桶索引 2 的下邊界,并映射到 scale=3 直方圖中存儲(chǔ)桶索引 1(即基數(shù))的下邊界。1 個(gè)直方圖——這些是完美子集的示例。

圖片

Ps:由于最新版本中 Summay 已經(jīng)不推薦,所以這里不做詳細(xì)的介紹。

2.2?OpenTelemetry VS Prometheus

在本文中我們就不詳細(xì)的介紹 Prometheus 的指標(biāo)類型了,詳細(xì)介紹參考 Prometheus 官網(wǎng)介紹 [ 7] 。我們通過對(duì)比 OpenTelemetry 指標(biāo)類型以及 Prometheus 指標(biāo)類型,我們會(huì)發(fā)現(xiàn):

  • OpenTelemetry 可以將 Metric 表示為增量,而不是累計(jì),存儲(chǔ)每個(gè)數(shù)據(jù)點(diǎn)之間的差異,而不是累計(jì)總和。然而Prometheus 在設(shè)計(jì)上不允許這樣做。
  • OpenTelemetry 允許 Metric 值為整數(shù),而 Prometheus 無法表達(dá)浮點(diǎn)數(shù)。
  • OpenTelemetry 可以將一些額外的元數(shù)據(jù)附加到直方圖中,允許您跟蹤最大值和最小值,這一點(diǎn)在有些場(chǎng)景是非常有用的。
  • OpenTelemetry 具有指數(shù)直方圖聚合類型(使用公式和刻度來計(jì)算 bucket 大小),Prometheus 不支持,但是可以實(shí)現(xiàn)兼容。

從上面的模型對(duì)比總結(jié)來說,OpenTelemetry 允許表示所有 Prometheus 度量類型(計(jì)數(shù)器、儀表、摘要和直方圖),盡管如此 Prometheus 無法表示 OpenTelemetry 度量的某些配置,包括 delta 表示和指數(shù)直方圖(盡管這些將很快添加到 Prometheus 中)以及整數(shù)值。所以換句話說,Prometheus 度量是 OpenTelemetry 度量的嚴(yán)格子集。

圖片

盡管這樣,但是兩者還是存在一些差異的,這里需要強(qiáng)調(diào)一下。

  • Prometheus 提供 Metric 收集、存儲(chǔ)和查詢,它通過通過抓取目標(biāo)來采集集指標(biāo),當(dāng)然也可以通過 pushgateway形式,相關(guān) Metric 數(shù)據(jù)最后存儲(chǔ)在 Prometheus 本地?cái)?shù)據(jù)庫(kù)或者其他遠(yuǎn)端時(shí)許數(shù)據(jù)庫(kù)中,最后通過 Prometheus 查詢語言 PromQL 進(jìn)行數(shù)據(jù)的讀取,所以 Prometheus 是一個(gè)完整的可觀測(cè)解決方法,集數(shù)據(jù)的采集、計(jì)算、存儲(chǔ)、報(bào)警、查詢等于一體。
  • OpenTelemetry 作用域要小很多。它通過推送或拉取使用整合的 API 收集指標(biāo)(以及跟蹤和日志),并將其發(fā)送到其他系統(tǒng)進(jìn)行存儲(chǔ)或查詢。所以 OpenTelemetry 只關(guān)注應(yīng)用程序交互的可觀測(cè)性部分,從而將信號(hào)的創(chuàng)建與存儲(chǔ)和查詢信號(hào)的操作問題脫鉤。所以在指標(biāo)的存儲(chǔ)上 OpenTelemetry Metric 通?;氐?Prometheus 或者 Prometheus 兼容的系統(tǒng)中。

2.3?如何選擇

不可否認(rèn) OpenTelemetry 與 Prometheus 都是非常優(yōu)秀的,有時(shí)候選擇上確實(shí)會(huì)比較糾結(jié),所以總的原則還是結(jié)合實(shí)際的業(yè)務(wù)場(chǎng)景出發(fā),因地制宜,以發(fā)展的眼光看待問題。如下的淺談如有不妥歡迎交流、批評(píng)與指正。

  • 如果你嘗試構(gòu)建統(tǒng)一的可觀測(cè)體系包含 Trace、Log 和 Metric,那么 OpenTelemetry 將允許使用相同的庫(kù)來對(duì)所有三種信號(hào)類型進(jìn)行檢測(cè),減少包依賴,方便運(yùn)維管理。這是一個(gè)顯著的好處,可以將三種相同的信號(hào)發(fā)送到同一一個(gè)后端也可以發(fā)送到不同的后端,OpenTelemetry 都支持。
  • 如果你希望你的應(yīng)用/系統(tǒng)/組件在云原生、容器化的場(chǎng)景下監(jiān)控指標(biāo)能更好的被觀測(cè),特別是開源、被第三方使用的場(chǎng)景,這種場(chǎng)景一般建議使用 Prometheus,比如常見的中間 Redis、MySQL、Zookeeper 等都支持 Prometheus Exporter 形式暴露指標(biāo)。
  • 比如特殊的網(wǎng)絡(luò)環(huán)境或者其他限制條件下,不能采用 Prometheus pull 形式,但在 Prometheus pushgateway 形式又存在多種弊端的情況下,可以嘗試使用 OpenTelemetry push 形式。

但無論如何選擇,有點(diǎn)尷尬的就是即使客戶端選擇了 OpenTelemetry,實(shí)際情況 OpenTelemetry Metric 存儲(chǔ)往往回到了 Prometheus 上。這也是當(dāng)前的現(xiàn)狀,大多數(shù)組織可能會(huì)混合使用這兩種標(biāo)準(zhǔn):用于基礎(chǔ)設(shè)施監(jiān)控的 Prometheus,利用更成熟的集成生態(tài)系統(tǒng)從數(shù)百個(gè)組件中提取指標(biāo),以及用于已開發(fā)服務(wù)的 OpenTelemetry。

圖片

下一章節(jié),我們重點(diǎn)介紹如何將 OpenTelemetry 指標(biāo)接入到 Prometheus。

如何將 OpenTelemetry Metric 接入 Prometheus

3.1 原理介紹

將 OpenTelemetry 指標(biāo)接入 Prometheus 的核心要素是需要將 OpenTelemetry 指標(biāo)轉(zhuǎn)化為 Prometheus 指標(biāo)格式,所以無論是 OpenTelemetry Collector 形式,還是直接在客戶端采用 Prometheus exporter bridge 形式,本質(zhì)上就是進(jìn)行數(shù)據(jù)格式轉(zhuǎn)化。

1)OpenTelemetry 官網(wǎng)

下圖為 OpenTelemetry 官網(wǎng)文檔建議的 OpenTelemetry 指標(biāo)到 Prometheus 指標(biāo)的轉(zhuǎn)化路徑。

詳細(xì)參考文檔:otlp-metric-points-to-prometheus [ 8]

圖片

2)OpenTelemetry Collector的實(shí)現(xiàn)

而 OpenTelemetry Collector 具體實(shí)現(xiàn)與官網(wǎng)的建議實(shí)現(xiàn)略有不同,詳細(xì)實(shí)現(xiàn)參考 prometheus-client-bridge [ 9] 。具體的轉(zhuǎn)化關(guān)系如下圖所示,與 OpenTelemetry 官方文檔的核心差異在于如下幾點(diǎn)。

  • OpenTelemetry 官方文檔建議將 monotonic & delta Sum 轉(zhuǎn)化為 Prometheus cumulative 的 Counter;而 OpenTelemetry Collector 的 Prometheus bridge 中將該中類型直接轉(zhuǎn)化為 Prometheus 的 gauge。
  • OpenTelemetry 官方文檔建議 Histogram delta 轉(zhuǎn)化為 cumulative,從而轉(zhuǎn)化為 Prometheus Histogram;雖然 OpenTelemetry Collector 代碼中沒有區(qū)分 Histogram 的 cumulative 及 delta,實(shí)際僅支持 cumulative 型 Histogram 轉(zhuǎn)化為 Prometheus Histogram。
  • OpenTelemetry 官方文檔建議 Exponential Histogram cumulative 轉(zhuǎn)化為 Prometheus 的 Histograms,而在 OpenTelemetry Collector 中 Exponential Histogram cumulative & Exponential Histogram delta 都做丟棄處理。

圖片

3.2 傳統(tǒng)接入方式

以 Java 應(yīng)用為例,當(dāng)前 Java 應(yīng)用(其他多語言應(yīng)用類似) 將 OpenTelemetry 指標(biāo)接入到 Prometheus 有如下幾種常見的方式,當(dāng)然還有其他解決方案如使用 micrometer,這里就不贅述。

方式 1: 應(yīng)用暴露 OpenTelemetry 指標(biāo),通過 gRpc/HTTP 上報(bào)到 OpenTelemetry Collector,OpenTelemetry Collector 中以 Prometheus exporter 形式暴露 Prometheus 指標(biāo),Prometheus 可通過靜態(tài) Job 形式進(jìn)行采集(或者其他服務(wù)發(fā)現(xiàn)的形式)。

詳細(xì)的代碼參考 Demo:https://github.com/OuyangKevin/opentelemetry-metric-java-demo/blob/main/metric-http/README.md

圖片

方式 2: 應(yīng)用暴露 OpenTelemetry 指標(biāo)通過,gRpc/HTTP 上報(bào)到 OpenTelemetry Collector,OpenTelemetry Collector 中直接將指標(biāo)轉(zhuǎn)化為 Prometheus 指標(biāo)格式,然后通過 remote write 形式寫入遠(yuǎn)端 Prometheus。

詳細(xì)的代碼參考 Demo:https://github.com/OuyangKevin/opentelemetry-metric-java-demo/blob/main/metric-grpc/README.md

Ps:老版本 OpenTelemetry Collector 不支持 remote write 形式,如需驗(yàn)證請(qǐng)使用最新版本。

圖片

方式3: Java 應(yīng)用引入 OpenTelemetry-exporter-prometheus lib,將 OpenTelemetry 指標(biāo)直接以 Prometheus Exporter 形式進(jìn)行暴露,Prometheus 直接以拉的形式進(jìn)行采集。

圖片

如下為初始化的核心代碼:

詳細(xì)代碼參考 Demo:https://github.com/OuyangKevin/opentelemetry-metric-java-demo/blob/main/metric-prometheus/README.md

PrometheusHttpServer prometheusHttpServer = PrometheusHttpServer.builder().setPort(1000).build();
Resource resource = Resource.getDefault().toBuilder().put(SERVICE_NAME, "opentelemetry-metric-demo-http").put(SERVICE_VERSION, "0.0.1").build();
SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder().registerMetricReader(prometheusHttpServer).setResource(resource).build();LongCounter longCounter = sdkMeterProvider.get("aliyun").counterBuilder("ping_long_counter").setDescription("ot http demo long_counter").setUnit("ms").build();

可觀測(cè)監(jiān)控 Prometheus 版零距離擁抱OpenTelemetry

目前,阿里云可觀測(cè)監(jiān)控 Prometheus 版已全面支持 OpenTelemetry 指標(biāo)接入,用戶僅需修改相關(guān)的上報(bào)地址以及鑒權(quán)配置即可無縫接入可觀測(cè)監(jiān)控 Prometheus 版,歡迎前往 Prometheus 控制臺(tái) [ 10] 進(jìn)行體驗(yàn)。

詳細(xì)的使用限制說明參考 OpenTelemetry 指標(biāo)上報(bào)地址使用說明:https://help.aliyun.com/zh/prometheus/user-guide/instructions-for-using-the-reporting-address-of-opentelemetry-indicator/

圖片

4.1 準(zhǔn)備工作

在接入可觀測(cè)監(jiān)控 Prometheus 版之前,請(qǐng)您確保已經(jīng)創(chuàng)建如下類型的 Prometheus 實(shí)例,具體操作請(qǐng)參考:

  • Prometheus 實(shí)例 for 容器服務(wù) [ 11]
  • Prometheus 實(shí)例 for 通用 [ 12]
  • Prometheus 實(shí)例 for ECS [ 13]
  • Prometheus 實(shí)例 for 云服務(wù) [ 14]

4.2 獲取 OpenTelemetry 指標(biāo)上報(bào)地址

  1. 登錄 Prometheus 控制臺(tái)。

  2. 在左側(cè)導(dǎo)航欄單擊監(jiān)控列表,進(jìn)入可觀測(cè)監(jiān)控 Prometheus 版的實(shí)例列表頁(yè)面。

  3. 在頁(yè)面頂部選擇 Prometheus 實(shí)例所在的地域,并在目標(biāo) Prometheus 實(shí)例右側(cè)的操作列單擊設(shè)置。

  4. 在設(shè)置頁(yè)簽上,根據(jù)需求復(fù)制公網(wǎng)或內(nèi)網(wǎng)的 OpenTelemetry 指標(biāo)上報(bào)地址(當(dāng)前僅支持 HTTP 形式,暫不支持使用 gRPC)。

圖片

4.3?應(yīng)用程序改造

如下以 Java 語言為例,在 SpringBoot 項(xiàng)目中進(jìn)行 OpenTelemetry 指標(biāo)的埋點(diǎn)。添加依賴

<properties><java.version>1.8</java.version><org.springframework.boot.version>2.7.17</org.springframework.boot.version><org.projectlombok.version>1.18.0</org.projectlombok.version><opentelemetry.version>1.31.0</opentelemetry.version></properties><dependencies><!-- springboot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${org.springframework.boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>${org.springframework.boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>${org.springframework.boot.version}</version></dependency><!-- opentelemetry --><dependency><groupId>io.opentelemetry</groupId><artifactId>opentelemetry-api</artifactId><version>${opentelemetry.version}</version></dependency><dependency><groupId>io.opentelemetry</groupId><artifactId>opentelemetry-sdk</artifactId><version>${opentelemetry.version}</version></dependency><dependency><groupId>io.opentelemetry</groupId><artifactId>opentelemetry-exporter-otlp</artifactId><version>${opentelemetry.version}</version></dependency></dependencies>

初始化 OpenTelemetry Bean

修改 OtlpHttpMetricExporterBuilder 中的 ?Endpoint 參數(shù),將其替換為上文獲取的 OpenTelemetry 指標(biāo)上報(bào)地址,即可將應(yīng)用的 OpenTelemetry 指標(biāo)接入可觀測(cè)監(jiān)控 Prometheus 版。

詳細(xì)請(qǐng)參考示例 Demo:https://github.com/OuyangKevin/opentelemetry-metric-java-demo/blob/main/metric-http/README.md

 @Beanpublic OpenTelemetry openTelemetry() {String endpoint = httpMetricConfig.getOetlExporterOtlpEndpoint();//自己修改Resource resource = Resource.getDefault().toBuilder().put("service.name", "opentelemetry-metric-demo-http").put("service.version", "0.0.1").build();SdkMeterProvider defaultSdkMeterProvider = SdkMeterProvider.builder().registerMetricReader(PeriodicMetricReader.builder(OtlpHttpMetricExporter.builder().setEndpoint(endpoint).build()).setInterval(15, TimeUnit.SECONDS).build()).setResource(resource).build();OpenTelemetry openTelemetry = OpenTelemetrySdk.builder().setMeterProvider(defaultSdkMeterProvider).buildAndRegisterGlobal();return openTelemetry;}

在初始化 OpenTelemetry bean 時(shí),可以對(duì)上報(bào)的客戶端進(jìn)行詳細(xì)地參數(shù)設(shè)置,具體配置說明如下:

1)OpenTelemetry 相關(guān)客戶端默認(rèn)沒有開啟壓縮,建議設(shè)置 Compression 參數(shù)為 gzip,減少網(wǎng)絡(luò)傳輸消耗。

OtlpHttpMetricExporter.builder().setEndpoint("******").setCompression("gzip").build()

2)OpenTelemetry 指標(biāo)上報(bào)可觀測(cè)監(jiān)控 Prometheus 版后,若需要針對(duì)所有的指標(biāo)加上前綴,可以設(shè)置 Header “metricNamespace”,如下所示設(shè)置 metricNamespace 為 ot,所有的上報(bào)的指標(biāo)將會(huì)加上"ot_"前綴。

OtlpHttpMetricExporter.builder().setEndpoint("******").setCompression("gzip").addHeader("metricNamespace","ot").build()

3)OpenTelemetry 指標(biāo)上報(bào)到可觀測(cè)監(jiān)控 Prometheus 版后,所有的指標(biāo)默認(rèn)會(huì)帶上 OpenTelemetry Scope Lables,如果不希望添加默認(rèn)的 Scope Lables,可以設(shè)置 Header skipGlobalLabel=true,如下所示。

OtlpHttpMetricExporter.builder().setEndpoint("******").setCompression("gzip").addHeader("skipGlobalLabel","true").build()

定義業(yè)務(wù)指標(biāo),如下樣例設(shè)置了一個(gè) LongCounter 及 LongHistogram。

@RestController
public class MetricController {@Autowiredprivate OpenTelemetry openTelemetry;@GetMapping("/ping")public String ping(){long startTime = System.currentTimeMillis();Meter meter = openTelemetry.getMeter("io_opentelemetry_metric_ping");LongCounter longCounter = meter.counterBuilder("ping_long_counter").setDescription("ot http demo long_counter").setUnit("ms").build();LongHistogram longHistogram= meter.histogramBuilder("ping_long_histogram").ofLongs().setDescription("ot http demo histogram").setUnit("ms").build();try{longCounter.add(1,Attributes.of(AttributeKey.stringKey("regionId"),"cn-hangzhou"));TimeUnit.MILLISECONDS.sleep(new Random().nextInt(10));}catch (Throwable e){}finally {longHistogram.record(System.currentTimeMillis() - startTime);}return "ping success!";}
}

關(guān)于 OpenTelemetry 指標(biāo)模型與阿里云可觀測(cè)監(jiān)控 Prometheus 版指標(biāo)模型轉(zhuǎn)化的映射關(guān)系如下。由于 Prometheus 對(duì)于 delta Histogram 支持需要轉(zhuǎn)化為 cumulative Histogram,所以可觀測(cè)監(jiān)控 Prometheus 版暫時(shí)不支持 OpenTelemetry delta Histogram 轉(zhuǎn)化,建議在該場(chǎng)景下使用 OpenTelemetry cumulative Histogram。

圖片

4.4 Grafana 中查看監(jiān)控?cái)?shù)據(jù)

  1. 登錄可觀測(cè)可視化 Grafana 版控制臺(tái) [ 15]
  2. 在工作區(qū)管理頁(yè)面單擊?Grafana 共享版,然后選擇對(duì)應(yīng)的公網(wǎng)地址單擊登錄。
  3. 在左側(cè)導(dǎo)航欄單擊圖標(biāo),然后 Explore 右側(cè)選擇對(duì)應(yīng)的 Datasource。
  4. 配置自己的大盤與告警,如下為客戶利用 OpenTelemetry 指標(biāo)配置的大盤。

圖片

阿里云可觀測(cè)監(jiān)控 Prometheus 版 VS 開源 Prometheus

阿里云可觀測(cè)監(jiān)控 Prometheus 版全面對(duì)接開源 Prometheus 生態(tài),支持類型豐富的組件監(jiān)控,覆蓋絕大部分開源基礎(chǔ)設(shè)施軟件指標(biāo)采集能力。提供多種開箱即用的預(yù)置監(jiān)控大盤,并集成豐富的 Kubernetes 基礎(chǔ)監(jiān)控以及常用服務(wù)預(yù)設(shè)看板,且提供全面托管的 Prometheus 服務(wù)。阿里云可觀測(cè)監(jiān)控 Prometheus 版的優(yōu)勢(shì)可以歸納為 “開箱即用”、“低成本”、“開源兼容”、“數(shù)據(jù)規(guī)模無上限”、“高性能”、“高可用性” 。

圖片

參考文檔:

https://www.timescale.com/blog/prometheus-vs-opentelemetry-metrics-a-complete-guide/

https://opentelemetry.io/docs/specs/otel/metrics/data-model/

https://opentelemetry.io/docs/specs/otel/compatibility/prometheus_and_openmetrics/

https://github.com/open-telemetry/opentelemetry-collector-contrib

相關(guān)鏈接:

[1]?Instruments

https://opentelemetry.io/docs/specs/otel/metrics/api/#instrument

[2]?Sums

https://github.com/open-telemetry/opentelemetry-proto/blob/v0.9.0/opentelemetry/proto/metrics/v1/metrics.proto#L230

[3]?monotonic

https://en.wikipedia.org/wiki/Monotonic_function

[4]?examplars

https://opentelemetry.io/docs/specs/otel/metrics/data-model/#exemplars

[5]?Gauge

https://github.com/open-telemetry/opentelemetry-proto/blob/v0.9.0/opentelemetry/proto/metrics/v1/metrics.proto#L200

[6]?Histogram

https://github.com/open-telemetry/opentelemetry-proto/blob/v0.9.0/opentelemetry/proto/metrics/v1/metrics.proto#L258

[7]?介紹

https://prometheus.io/docs/concepts/metric_types/

[8]?otlp-metric-points-to-prometheus

https://opentelemetry.io/docs/specs/otel/compatibility/prometheus_and_openmetrics/#otlp-metric-points-to-prometheus

[9]?prometheus-client-bridge

https://github.com/open-telemetry/opentelemetry-java-contrib/blob/main/prometheus-client-bridge/src/main/java/io/opentelemetry/contrib/metrics/prometheus/clientbridge/MetricAdapter.java

[10]?Prometheus 控制臺(tái)

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fprometheus.console.aliyun.com%2F#/home

[11]?Prometheus 實(shí)例 for 容器服務(wù)

https://help.aliyun.com/zh/prometheus/user-guide/create-a-prometheus-instance-to-monitor-an-ack-cluster

[12]?Prometheus 實(shí)例 for 通用

https://help.aliyun.com/zh/prometheus/user-guide/create-a-prometheus-instance-for-remote-storage

[13]?Prometheus 實(shí)例 for ECS

https://help.aliyun.com/zh/prometheus/user-guide/create-a-prometheus-instance-to-monitor-an-ecs-instance

[14]?Prometheus 實(shí)例 for 云服務(wù)

https://help.aliyun.com/zh/prometheus/user-guide/create-a-prometheus-instance-to-monitor-alibaba-cloud-services

[15]?可觀測(cè)可視化?Grafana 版控制臺(tái)

https://account.aliyun.com/login/login.htm?oauth_callback=/#/grafana/workspace/

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

相關(guān)文章:

  • 域名和網(wǎng)站名不一樣百度推廣登錄平臺(tái)網(wǎng)址
  • 太湖云建站網(wǎng)站建設(shè)推廣普通話手抄報(bào)內(nèi)容50字
  • 做公司網(wǎng)站有什么亮點(diǎn)seo基礎(chǔ)培訓(xùn)
  • java高端網(wǎng)站建設(shè)成都網(wǎng)絡(luò)營(yíng)銷策劃
  • 門戶網(wǎng)站建設(shè)自查報(bào)告seo日常工作內(nèi)容
  • 做網(wǎng)站 公司有哪些互聯(lián)網(wǎng)營(yíng)銷平臺(tái)
  • 網(wǎng)站建設(shè)的運(yùn)用場(chǎng)景百度推廣管理平臺(tái)登錄
  • 企業(yè)做網(wǎng)站樂云seo快速上線2345網(wǎng)址導(dǎo)航桌面版
  • 洪湖自己的網(wǎng)站seo大牛
  • 官網(wǎng)站超鏈接怎么做優(yōu)就業(yè)seo
  • 做圖表用的網(wǎng)站優(yōu)化seo軟件
  • 網(wǎng)站關(guān)鍵詞代碼怎么做互聯(lián)網(wǎng)推廣有哪些方式
  • 威海高區(qū)有沒有建設(shè)局的網(wǎng)站uc搜索引擎入口
  • 簡(jiǎn)歷怎么制作網(wǎng)站新聞發(fā)稿
  • 如何做導(dǎo)航網(wǎng)站市場(chǎng)推廣怎么寫
  • 泉州企業(yè)網(wǎng)站維護(hù)制作域名歸屬查詢
  • 家庭寬帶怎么做網(wǎng)站網(wǎng)站如何宣傳推廣
  • 網(wǎng)站建設(shè) 徐州聯(lián)合早報(bào) 即時(shí)消息
  • seo建站是什么意思愛廷玖達(dá)泊西汀
  • 成都seo整站上海搜索引擎優(yōu)化1
  • 企業(yè)網(wǎng)站建設(shè)費(fèi)用定金怎么做賬官網(wǎng)排名優(yōu)化方案
  • 網(wǎng)站廣告形式合肥seo推廣公司哪家好
  • 百度網(wǎng)站下拉怎么做的怎么在百度上注冊(cè)店鋪
  • 上海專業(yè)制作網(wǎng)站口碑營(yíng)銷的案例及分析
  • 數(shù)碼產(chǎn)品網(wǎng)站建設(shè)百度seo優(yōu)化技巧
  • php是專門做網(wǎng)站的最全資源搜索引擎
  • 如何建設(shè)網(wǎng)站并與數(shù)據(jù)庫(kù)相連百度輸入法免費(fèi)下載
  • 鄭州網(wǎng)站制作漢獅杭州seo網(wǎng)站推廣排名
  • 裝修的網(wǎng)站都有哪些手機(jī)seo排名軟件
  • 網(wǎng)頁(yè)圖片大小怎么調(diào)整sem優(yōu)化怎么做