日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

從 Prometheus 到 OpenTelemetry:指標(biāo)監(jiān)控的演進(jìn)與實(shí)踐

來源: 責(zé)編: 時(shí)間:2024-06-14 17:40:00 180觀看
導(dǎo)讀背景關(guān)于 metrics 我最早接觸相關(guān)概念的就是 prometheus,它是第二個(gè)加入 CNCF(云原生)社區(qū)的項(xiàng)目(第一個(gè)是 kubernetes),可見在云原生領(lǐng)域 Metrics 指標(biāo)監(jiān)控從誕生之初就是一個(gè)非常重要的組件。現(xiàn)實(shí)也確實(shí)如此,如今只要使用

背景

關(guān)于 metrics 我最早接觸相關(guān)概念的就是 prometheus,它是第二個(gè)加入 CNCF(云原生)社區(qū)的項(xiàng)目(第一個(gè)是 kubernetes),可見在云原生領(lǐng)域 Metrics 指標(biāo)監(jiān)控從誕生之初就是一個(gè)非常重要的組件。7Hv28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)實(shí)也確實(shí)如此,如今只要使用到了 kubernetes 相關(guān)的項(xiàng)目,對(duì)其監(jiān)控就是必不可少的。7Hv28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然也不止是云原生的項(xiàng)目才需要 Metrics 指標(biāo)監(jiān)控,我們?nèi)魏我粋€(gè)業(yè)務(wù)都是需要的,不然我們的服務(wù)運(yùn)行對(duì)開發(fā)運(yùn)維來說都是一個(gè)黑盒,無法知道此時(shí)系統(tǒng)的運(yùn)行情況,因此才需要我們的業(yè)務(wù)系統(tǒng)將一些關(guān)鍵運(yùn)行指標(biāo)暴露出來。7Hv28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7Hv28資訊網(wǎng)——每日最新資訊28at.com

業(yè)務(wù)數(shù)據(jù):比如訂單的增長(zhǎng)率、銷售金額等業(yè)務(wù)數(shù)據(jù);同時(shí)還有應(yīng)用自身的資源占用情況:7Hv28資訊網(wǎng)——每日最新資訊28at.com

  • QPS
  • Latency
  • 內(nèi)存
  • CPU 等信息。

在使用 OpenTelemetry 之前,因?yàn)?prometheus 是這部分的絕對(duì)標(biāo)準(zhǔn),所以我們通常都會(huì)使用 prometheus 的包來暴露這些指標(biāo):7Hv28資訊網(wǎng)——每日最新資訊28at.com

<!-- The client --><dependency>  <groupId>io.prometheus</groupId>  <artifactId>simpleclient</artifactId>  <version>0.16.0</version></dependency><!-- Hotspot JVM metrics--><dependency>  <groupId>io.prometheus</groupId>  <artifactId>simpleclient_hotspot</artifactId>  <version>0.16.0</version></dependency>

暴露一個(gè)自定義的指標(biāo)也很簡(jiǎn)單:7Hv28資訊網(wǎng)——每日最新資訊28at.com

import io.prometheus.client.Counter;class YourClass {  static final Counter requests = Counter.build()     .name("requests_total").help("Total requests.").register();  void processRequest() {    requests.inc();    // Your code here.  }}

這是暴露一個(gè)單調(diào)遞增的指標(biāo),prometheus 還提供了其他幾種指標(biāo)類型:7Hv28資訊網(wǎng)——每日最新資訊28at.com

  • Counter
  • Gauge
  • Histogram

之后我們只需要在 prometheus 中配置一些抓取規(guī)則即可:7Hv28資訊網(wǎng)——每日最新資訊28at.com

scrape_configs:  - job_name: 'springboot'    scrape_interval: 10s    static_configs:      - targets: ['localhost:8080'] # Spring Boot ip+port

當(dāng)然如果是運(yùn)行在 kubernetes 環(huán)境,prometheus 也可以基于服務(wù)發(fā)現(xiàn)配置一些規(guī)則,自動(dòng)抓取我們的 Pod 的數(shù)據(jù),由于不是本文的重點(diǎn)就不過多介紹。7Hv28資訊網(wǎng)——每日最新資訊28at.com

基本組件

在 OpenTelemetry 中自然也提供了 Metrics 這個(gè)組件,同時(shí)它也是完全兼容 Prometheus,所以我們理解和使用起來并不復(fù)雜。7Hv28資訊網(wǎng)——每日最新資訊28at.com

MeterProvider

不同于 prometheus 客戶端中直接提供了 Counter 就可以創(chuàng)建指標(biāo)了,在 OpenTelemetry 中會(huì)提供一個(gè) MeterProvider 的接口,使用這個(gè)接口可以獲取 Meter,再使用 Meter 才可以創(chuàng)建 Counter、Gauge、Histogram 等數(shù)據(jù)。7Hv28資訊網(wǎng)——每日最新資訊28at.com

下面來看看具體如何使用,這里我以 Pulsar 源碼的代碼進(jìn)行演示:7Hv28資訊網(wǎng)——每日最新資訊28at.com

public InstrumentProvider(OpenTelemetry otel) {      if (otel == null) {          // By default, metrics are disabled, unless the OTel java agent is configured.          // This allows to enable metrics without any code change.        otel = GlobalOpenTelemetry.get();      }    this.meter = otel.getMeterProvider()              .meterBuilder("org.apache.pulsar.client")              .setInstrumentationVersion(PulsarVersion.getVersion())              .build();  }LongCounterBuilder builder = meter.counterBuilder(name)          .setDescription(description)          .setUnit(unit.toString());

Meter Exporter

Meter Exporter 則是一個(gè) OpenTelemetry 獨(dú)有的概念,與我們之前講到的一樣:OpenTelemetry 作為廠商無關(guān)的平臺(tái),允許我們將數(shù)據(jù)寫入到任何兼容的產(chǎn)品里。7Hv28資訊網(wǎng)——每日最新資訊28at.com

所以我們?cè)谑褂?Metrics 時(shí)需要指定一個(gè) exporter:7Hv28資訊網(wǎng)——每日最新資訊28at.com

Exporter 類型7Hv28資訊網(wǎng)——每日最新資訊28at.com

作用7Hv28資訊網(wǎng)——每日最新資訊28at.com

備注7Hv28資訊網(wǎng)——每日最新資訊28at.com

參數(shù)7Hv28資訊網(wǎng)——每日最新資訊28at.com

OTLP Exporter7Hv28資訊網(wǎng)——每日最新資訊28at.com

通過 OpenTelemetry Protocol(OTLP) 發(fā)送指標(biāo)數(shù)據(jù)到 collect。7Hv28資訊網(wǎng)——每日最新資訊28at.com

默認(rèn)生產(chǎn)環(huán)境中推薦使用,需要將數(shù)據(jù)發(fā)送到支持 OTLP 的后端,如 OpenTelemetry Collector。7Hv28資訊網(wǎng)——每日最新資訊28at.com

-Dotel.metrics.exporter=otlp (default)7Hv28資訊網(wǎng)——每日最新資訊28at.com

Console Exporter7Hv28資訊網(wǎng)——每日最新資訊28at.com

將指標(biāo)數(shù)據(jù)打印到控制臺(tái)的導(dǎo)出器。7Hv28資訊網(wǎng)——每日最新資訊28at.com

開發(fā)和調(diào)試,快速查看指標(biāo)數(shù)據(jù)。7Hv28資訊網(wǎng)——每日最新資訊28at.com

-Dotel.metrics.exporter=console7Hv28資訊網(wǎng)——每日最新資訊28at.com

Prometheus Exporter7Hv28資訊網(wǎng)——每日最新資訊28at.com

將指標(biāo)數(shù)據(jù)以 Prometheus 抓取的格式暴露給 Prometheus 服務(wù)。7Hv28資訊網(wǎng)——每日最新資訊28at.com

與 Prometheus 集成,適用于需要 Prometheus 監(jiān)控的場(chǎng)景,這個(gè)可以無縫和以往使用 prometheus 的場(chǎng)景兼容7Hv28資訊網(wǎng)——每日最新資訊28at.com

-Dotel.metrics.exporter=prometheus7Hv28資訊網(wǎng)——每日最新資訊28at.com

Metric Instruments

與 prometheus 類似,OpenTelemetry 也提供了以下幾種指標(biāo)類型:7Hv28資訊網(wǎng)——每日最新資訊28at.com

  • Counter:?jiǎn)握{(diào)遞增計(jì)數(shù)器,比如可以用來記錄訂單數(shù)、總的請(qǐng)求數(shù)。
  • UpDownCounter:與 Counter 類似,只不過它可以遞減。
  • Gauge:用于記錄隨時(shí)在變化的值,比如內(nèi)存使用量、CPU 使用量等。
  • Histogram:通常用于記錄請(qǐng)求延遲、響應(yīng)時(shí)間等。

同時(shí)每個(gè)指標(biāo)還有以下幾個(gè)字段:7Hv28資訊網(wǎng)——每日最新資訊28at.com

  • Name:名稱,必填。
  • Kind:類型,必填。
  • Unit:?jiǎn)挝唬蛇x。
  • Description:描述,可選。
messageInCounter = meter          .counterBuilder(MESSAGE_IN_COUNTER)          .setUnit("{message}")          .setDescription("The total number of messages received for this topic.")          .buildObserver();

還是以 Pulsar 的為例,messageInCounter 是一個(gè)記錄總的消息接收數(shù)量的 Counter 類型。7Hv28資訊網(wǎng)——每日最新資訊28at.com

subscriptionCounter = meter          .upDownCounterBuilder(SUBSCRIPTION_COUNTER)          .setUnit("{subscription}")          .setDescription("The number of Pulsar subscriptions of the topic served by this broker.")          .buildObserver();

這是記錄一個(gè)訂閱者數(shù)量的指標(biāo),類型是 UpDownCounter,也就是可以增加減少的指標(biāo)。7Hv28資訊網(wǎng)——每日最新資訊28at.com

private static final List<Double> latencyHistogramBuckets =          Lists.newArrayList(.0005, .001, .0025, .005, .01, .025, .05, .1, .25, .5, 1.0, 2.5, 5.0, 10.0, 30.0, 60.0);DoubleHistogramBuilder builder = meter.histogramBuilder("pulsar.client.producer.message.send.duration")          .setDescription("Publish latency experienced by the application, includes client batching time")          .setUnit(Unit.Seconds.toString())          .setExplicitBucketBoundariesAdvice(latencyHistogramBuckets);

這是一個(gè)記錄 Pulsar producer 發(fā)送延遲的指標(biāo),類型是 Histogram。7Hv28資訊網(wǎng)——每日最新資訊28at.com

backlogQuotaAge = meter          .gaugeBuilder(BACKLOG_QUOTA_AGE)          .ofLongs()          .setUnit("s")          .setDescription("The age of the oldest unacknowledged message (backlog).")          .buildObserver();

這是一個(gè)記錄最大 unack 也就是 backlog 時(shí)間的指標(biāo),類型是 Gauge。7Hv28資訊網(wǎng)——每日最新資訊28at.com

案例

在之前的文章:實(shí)戰(zhàn):如何編寫一個(gè) OpenTelemetry Extensions中講過如何開發(fā)一個(gè) OpenTelemetry 的 extension,其實(shí)當(dāng)時(shí)我就是開發(fā)了一個(gè)用于在 Pulsar 客戶端中暴露指標(biāo)的一個(gè)插件。7Hv28資訊網(wǎng)——每日最新資訊28at.com

不過目前 Pulsar 社區(qū)已經(jīng)集成了該功能。7Hv28資訊網(wǎng)——每日最新資訊28at.com

其中的核心代碼與上面講到的類似:7Hv28資訊網(wǎng)——每日最新資訊28at.com

public static void registerObservers() {        Meter meter = MetricsRegistration.getMeter();            meter.gaugeBuilder("pulsar_producer_num_msg_send")                .setDescription("The number of messages published in the last interval")                .ofLongs()                .buildWithCallback(                        r -> recordProducerMetrics(r, ProducerStats::getNumMsgsSent));private static void recordProducerMetrics(ObservableLongMeasurement observableLongMeasurement, Function<ProducerStats, Long> getter) {        for (Producer producer : CollectionHelper.PRODUCER_COLLECTION.list()) {            ProducerStats stats = producer.getStats();            String topic = producer.getTopic();            if (topic.endsWith(RetryMessageUtil.RETRY_GROUP_TOPIC_SUFFIX)) {                continue;            }        observableLongMeasurement.record(getter.apply(stats),                    Attributes.of(PRODUCER_NAME, producer.getProducerName(), TOPIC, topic));        }}

只是這里使用了 buildWithCallback 回調(diào)函數(shù),OpenTelemetry 會(huì)每隔 30s 調(diào)用一次這個(gè)函數(shù),通常適用于 Gauge 類型的數(shù)據(jù)。7Hv28資訊網(wǎng)——每日最新資訊28at.com

java -javaagent:opentelemetry-javaagent.jar /       -Dotel.javaagent.extensinotallow=ext.jar  /     -Dotel.metrics.exporter=prometheus /     -Dotel.exporter.prometheus.port=18180 /     -jar myapp.jar

配合上 Prometheus 的兩個(gè)啟動(dòng)參數(shù)就可以在本地 18180 中獲取到指標(biāo)數(shù)據(jù):7Hv28資訊網(wǎng)——每日最新資訊28at.com

curl http://127.0.0.1:18180/metrics

當(dāng)然也可以直接發(fā)往 OpenTelemetry-Collector 中,再由它發(fā)往 prometheus,只是這樣需要額外在 collector 中配置一下:7Hv28資訊網(wǎng)——每日最新資訊28at.com

exporters:  debug: {}  otlphttp:    metrics_endpoint: http://promethus:8480/insert/0/opentelemetry/api/v1/pushservice:  pipelines:    metrics:      exporters:      - otlphttp      processors:      - k8sattributes      - batch      receivers:      - otlp

圖片圖片7Hv28資訊網(wǎng)——每日最新資訊28at.com

這樣我們就可以在 Grafana 中通過 prometheus 查詢到數(shù)據(jù)了。7Hv28資訊網(wǎng)——每日最新資訊28at.com

有一點(diǎn)需要注意,如果我們自定義的指標(biāo)最好是參考官方的語(yǔ)義和命名規(guī)范來定義這些指標(biāo)名稱。7Hv28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片7Hv28資訊網(wǎng)——每日最新資訊28at.com

比如 OpenTelemetry 的規(guī)范中名稱是用 . 來進(jìn)行分隔的。7Hv28資訊網(wǎng)——每日最新資訊28at.com

切換為 OpenTelemetry 之后自然就不需要依賴 prometheus 的包,取而代之的是 OTel 的包:7Hv28資訊網(wǎng)——每日最新資訊28at.com

compileOnly 'io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.34.1'  compileOnly 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:1.32.0'

總結(jié)

相對(duì)來說 Metrics 的使用比 Trace 簡(jiǎn)單的多,同時(shí) Metrics 其實(shí)也可以和 Trace 進(jìn)行關(guān)聯(lián),也就是 Exemplars,限于篇幅就不在本文展開了,感興趣的可以自行查閱。7Hv28資訊網(wǎng)——每日最新資訊28at.com

參考鏈接:7Hv28資訊網(wǎng)——每日最新資訊28at.com

  • https://github.com/apache/pulsar/blob/master/pulsar-client/src/main/java/org/apache/pulsar/client/impl/metrics/InstrumentProvider.java
  • https://opentelemetry.io/docs/specs/semconv/general/metrics/
  • https://opentelemetry.io/docs/specs/otel/metrics/data-model/#exemplars

本文鏈接:http://www.www897cc.com/showinfo-26-93865-0.html從 Prometheus 到 OpenTelemetry:指標(biāo)監(jiān)控的演進(jìn)與實(shí)踐

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 23k star超火項(xiàng)目,請(qǐng)求優(yōu)化寫的一塌糊涂!我直接重構(gòu)!

下一篇: 有點(diǎn)東西,Template可以直接使用Setup語(yǔ)法糖中的變量原來是因?yàn)檫@個(gè)

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 大石桥市| 石首市| 唐山市| 东源县| 长丰县| 山西省| 柯坪县| 泸州市| 通化县| 罗江县| 静宁县| 清河县| 扶风县| 丹东市| 临泉县| 许昌市| 临湘市| 平凉市| 措勤县| 康保县| 九龙城区| 扎鲁特旗| 信阳市| 忻城县| 阿坝县| 镇远县| 长葛市| 沈阳市| 谢通门县| 玉屏| 松滋市| 徐水县| 秭归县| 腾冲县| 紫金县| 和硕县| 郑州市| 余姚市| 岳池县| 山东| 乡城县|