当前位置:首页 > 科技  > 软件

从 Prometheus 到 OpenTelemetry:指标监控的演进与实践

来源: 责编: 时间:2024-06-14 17:40:00 236观看
导读背景关于 metrics 我最早接触相关概念的就是 prometheus,它是第二个加入 CNCF(云原生)社区的项目(第一个是 kubernetes),可见在云原生领域 Metrics 指标监控从诞生之初就是一个非常重要的组件。现实也确实如此,如今只要使用

背景

关于 metrics 我最早接触相关概念的就是 prometheus,它是第二个加入 CNCF(云原生)社区的项目(第一个是 kubernetes),可见在云原生领域 Metrics 指标监控从诞生之初就是一个非常重要的组件。1SQ28资讯网——每日最新资讯28at.com

现实也确实如此,如今只要使用到了 kubernetes 相关的项目,对其监控就是必不可少的。1SQ28资讯网——每日最新资讯28at.com

当然也不止是云原生的项目才需要 Metrics 指标监控,我们任何一个业务都是需要的,不然我们的服务运行对开发运维来说都是一个黑盒,无法知道此时系统的运行情况,因此才需要我们的业务系统将一些关键运行指标暴露出来。1SQ28资讯网——每日最新资讯28at.com

图片图片1SQ28资讯网——每日最新资讯28at.com

业务数据:比如订单的增长率、销售金额等业务数据;同时还有应用自身的资源占用情况:1SQ28资讯网——每日最新资讯28at.com

  • QPS
  • Latency
  • 内存
  • CPU 等信息。

在使用 OpenTelemetry 之前,因为 prometheus 是这部分的绝对标准,所以我们通常都会使用 prometheus 的包来暴露这些指标:1SQ28资讯网——每日最新资讯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>

暴露一个自定义的指标也很简单:1SQ28资讯网——每日最新资讯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.  }}

这是暴露一个单调递增的指标,prometheus 还提供了其他几种指标类型:1SQ28资讯网——每日最新资讯28at.com

  • Counter
  • Gauge
  • Histogram

之后我们只需要在 prometheus 中配置一些抓取规则即可:1SQ28资讯网——每日最新资讯28at.com

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

当然如果是运行在 kubernetes 环境,prometheus 也可以基于服务发现配置一些规则,自动抓取我们的 Pod 的数据,由于不是本文的重点就不过多介绍。1SQ28资讯网——每日最新资讯28at.com

基本组件

在 OpenTelemetry 中自然也提供了 Metrics 这个组件,同时它也是完全兼容 Prometheus,所以我们理解和使用起来并不复杂。1SQ28资讯网——每日最新资讯28at.com

MeterProvider

不同于 prometheus 客户端中直接提供了 Counter 就可以创建指标了,在 OpenTelemetry 中会提供一个 MeterProvider 的接口,使用这个接口可以获取 Meter,再使用 Meter 才可以创建 Counter、Gauge、Histogram 等数据。1SQ28资讯网——每日最新资讯28at.com

下面来看看具体如何使用,这里我以 Pulsar 源码的代码进行演示:1SQ28资讯网——每日最新资讯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 则是一个 OpenTelemetry 独有的概念,与我们之前讲到的一样:OpenTelemetry 作为厂商无关的平台,允许我们将数据写入到任何兼容的产品里。1SQ28资讯网——每日最新资讯28at.com

所以我们在使用 Metrics 时需要指定一个 exporter:1SQ28资讯网——每日最新资讯28at.com

Exporter 类型1SQ28资讯网——每日最新资讯28at.com

作用1SQ28资讯网——每日最新资讯28at.com

备注1SQ28资讯网——每日最新资讯28at.com

参数1SQ28资讯网——每日最新资讯28at.com

OTLP Exporter1SQ28资讯网——每日最新资讯28at.com

通过 OpenTelemetry Protocol(OTLP) 发送指标数据到 collect。1SQ28资讯网——每日最新资讯28at.com

默认生产环境中推荐使用,需要将数据发送到支持 OTLP 的后端,如 OpenTelemetry Collector。1SQ28资讯网——每日最新资讯28at.com

-Dotel.metrics.exporter=otlp (default)1SQ28资讯网——每日最新资讯28at.com

Console Exporter1SQ28资讯网——每日最新资讯28at.com

将指标数据打印到控制台的导出器。1SQ28资讯网——每日最新资讯28at.com

开发和调试,快速查看指标数据。1SQ28资讯网——每日最新资讯28at.com

-Dotel.metrics.exporter=console1SQ28资讯网——每日最新资讯28at.com

Prometheus Exporter1SQ28资讯网——每日最新资讯28at.com

将指标数据以 Prometheus 抓取的格式暴露给 Prometheus 服务。1SQ28资讯网——每日最新资讯28at.com

与 Prometheus 集成,适用于需要 Prometheus 监控的场景,这个可以无缝和以往使用 prometheus 的场景兼容1SQ28资讯网——每日最新资讯28at.com

-Dotel.metrics.exporter=prometheus1SQ28资讯网——每日最新资讯28at.com

Metric Instruments

与 prometheus 类似,OpenTelemetry 也提供了以下几种指标类型:1SQ28资讯网——每日最新资讯28at.com

  • Counter:单调递增计数器,比如可以用来记录订单数、总的请求数。
  • UpDownCounter:与 Counter 类似,只不过它可以递减。
  • Gauge:用于记录随时在变化的值,比如内存使用量、CPU 使用量等。
  • Histogram:通常用于记录请求延迟、响应时间等。

同时每个指标还有以下几个字段:1SQ28资讯网——每日最新资讯28at.com

  • Name:名称,必填。
  • Kind:类型,必填。
  • Unit:单位,可选。
  • Description:描述,可选。
messageInCounter = meter          .counterBuilder(MESSAGE_IN_COUNTER)          .setUnit("{message}")          .setDescription("The total number of messages received for this topic.")          .buildObserver();

还是以 Pulsar 的为例,messageInCounter 是一个记录总的消息接收数量的 Counter 类型。1SQ28资讯网——每日最新资讯28at.com

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

这是记录一个订阅者数量的指标,类型是 UpDownCounter,也就是可以增加减少的指标。1SQ28资讯网——每日最新资讯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);

这是一个记录 Pulsar producer 发送延迟的指标,类型是 Histogram。1SQ28资讯网——每日最新资讯28at.com

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

这是一个记录最大 unack 也就是 backlog 时间的指标,类型是 Gauge。1SQ28资讯网——每日最新资讯28at.com

案例

在之前的文章:实战:如何编写一个 OpenTelemetry Extensions中讲过如何开发一个 OpenTelemetry 的 extension,其实当时我就是开发了一个用于在 Pulsar 客户端中暴露指标的一个插件。1SQ28资讯网——每日最新资讯28at.com

不过目前 Pulsar 社区已经集成了该功能。1SQ28资讯网——每日最新资讯28at.com

其中的核心代码与上面讲到的类似:1SQ28资讯网——每日最新资讯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 回调函数,OpenTelemetry 会每隔 30s 调用一次这个函数,通常适用于 Gauge 类型的数据。1SQ28资讯网——每日最新资讯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 的两个启动参数就可以在本地 18180 中获取到指标数据:1SQ28资讯网——每日最新资讯28at.com

curl http://127.0.0.1:18180/metrics

当然也可以直接发往 OpenTelemetry-Collector 中,再由它发往 prometheus,只是这样需要额外在 collector 中配置一下:1SQ28资讯网——每日最新资讯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

图片图片1SQ28资讯网——每日最新资讯28at.com

这样我们就可以在 Grafana 中通过 prometheus 查询到数据了。1SQ28资讯网——每日最新资讯28at.com

有一点需要注意,如果我们自定义的指标最好是参考官方的语义和命名规范来定义这些指标名称。1SQ28资讯网——每日最新资讯28at.com

图片图片1SQ28资讯网——每日最新资讯28at.com

比如 OpenTelemetry 的规范中名称是用 . 来进行分隔的。1SQ28资讯网——每日最新资讯28at.com

切换为 OpenTelemetry 之后自然就不需要依赖 prometheus 的包,取而代之的是 OTel 的包:1SQ28资讯网——每日最新资讯28at.com

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

总结

相对来说 Metrics 的使用比 Trace 简单的多,同时 Metrics 其实也可以和 Trace 进行关联,也就是 Exemplars,限于篇幅就不在本文展开了,感兴趣的可以自行查阅。1SQ28资讯网——每日最新资讯28at.com

参考链接:1SQ28资讯网——每日最新资讯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.28at.com/showinfo-26-93865-0.html从 Prometheus 到 OpenTelemetry:指标监控的演进与实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 23k star超火项目,请求优化写的一塌糊涂!我直接重构!

下一篇: 有点东西,Template可以直接使用Setup语法糖中的变量原来是因为这个

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 机构称Q2全球智能手机出货量同比下滑11% 苹果份额依旧第2

    7月20日消息,据外媒报道,研究机构的报告显示,由于需求下滑,今年二季度全球智能手机的出货量,同比下滑了11%,三星、苹果等主要厂商的销量,较去年同期均有下
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
Top