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

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

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

背景

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

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

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

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

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

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

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

暴露一个自定义的指标也很简单:ErU28资讯网——每日最新资讯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 还提供了其他几种指标类型:ErU28资讯网——每日最新资讯28at.com

  • Counter
  • Gauge
  • Histogram

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

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

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

基本组件

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

MeterProvider

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Metric Instruments

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

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

同时每个指标还有以下几个字段:ErU28资讯网——每日最新资讯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 类型。ErU28资讯网——每日最新资讯28at.com

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

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

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

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

案例

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

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

其中的核心代码与上面讲到的类似:ErU28资讯网——每日最新资讯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 类型的数据。ErU28资讯网——每日最新资讯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 中获取到指标数据:ErU28资讯网——每日最新资讯28at.com

curl http://127.0.0.1:18180/metrics

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

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

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

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

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

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

切换为 OpenTelemetry 之后自然就不需要依赖 prometheus 的包,取而代之的是 OTel 的包:ErU28资讯网——每日最新资讯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,限于篇幅就不在本文展开了,感兴趣的可以自行查阅。ErU28资讯网——每日最新资讯28at.com

参考链接:ErU28资讯网——每日最新资讯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语法糖中的变量原来是因为这个

标签:
  • 热门焦点
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
  • 三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    据官方此前宣布,三星将于7月26日也就是明天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top