Skip to content

GreptimeDB 正式支持 OpenTelemetry OTLP Metric 采集

OTLP 协议在今年 7 月正式发布了 1.0.0 版本。为了方便使用 OpenTelemetry 框架采集可观测数据的用户,我们现已在 GreptimeDB 上支持了 OTLP Metric 数据的写入。
GreptimeDB 正式支持 OpenTelemetry OTLP Metric 采集
本页内容

OpenTelemetry 致力于提供一套的 API 和 SDK 帮助云原生应用搭建可以独立实现的标准化 Observability 能力。其中 OTLP 是 OpenTelemetry 定义的一套可观测性数据的编码和传输协议。OTLP 协议在今年 7 月正式发布了 1.0.0 版本。为了方便使用 OpenTelemetry 框架采集可观测数据的用户,我们现已在 GreptimeDB 上支持了 OTLP Metric 数据的写入。

什么是 OTLP ​

OpenTelemetry 将可观测数据的生命周期定义为三个环节:起源、传输和落盘状态。其中 OTLP 主要负责衔接来源和落盘的流程,它对可观测领域的数据类型做了建模,并且定义了数据请求响应的协议。

(图 1:可观测数据的生命周期活动示意图)
(图 1:可观测数据的生命周期活动示意图)

当前市面上存在多套可观测数据的传输协议,但大多来自某个特定实现的定义,比如 InfluxDB 的 line protocol,Prometheus 的 scrape 输出。OTLP 作为一个中立的协议可以避免用户绑定在某个生态上。

OTLP 在数据类型上支持三大可观测数据:

  • Metrics

  • Logs

  • Traces

在传输和采集和传输的方式上允许:

  • gRPC

  • Protobuf over HTTP

  • JSON over HTTP

此外,OTLP 还兼容了 OpenTelemetry 标准里对 SDK 的抽象,包含了 Resource 、Instrumentation 等概念便于其实现获得更多元数据。OTLP 提供了多种语言的客户端实现,包括 Java,Python,Go,JavaScript 和 Rust 等等,让开发者可以快速接入。

GreptimeDB 作为一个 OTLP Metrics Collector ​

在最近的版本中,我们也在 GreptimeDB 上实现了 OTLP 协议的 Metric 部分,这样,使用 OpenTelemetry 框架采集可观测数据的用户,可以直接在自己代码中配置 GreptimeDB 作为 collector 。

OTLP metrics 的数据模型按照这样的规则映射到了 GreptimeDB 的数据模型上:

  • Metric 的名称将被作为 GreptimeDB 表的名称,当表不存在时会自动创建;

  • 所有的 Attribute ,包含 resource 级别、scope 级别和 data_point 级别,都被作为 GreptimeDB 表的 tags 字段;

  • 数据点的时间戳被作为 GreptimeDB 的时间戳索引,列名 greptime_timestamp;

  • Gauge/Sum 两种类型的数据点数据被作为 field 列,列名 greptime_value;

  • Summary 类型的每个 quantile 被作为单独的数据列,列名 greptime_pxx ,其中 xx 是 quantile 的数据,如 90 / 99 等;

  • Histogram 和 ExponentialHistogrrm 暂时未被支持,我们可能在后续版本中推出 Histogram 数据类型来原生支持这两种类型。

一个实际的例子 ​

以 Java 为例,你可以配置自己的 OpenTelemetry SDK 定期采集数据,并写入到 GreptimeDB 的 OTLP/HTTP 采集器地址上:

java
  static OpenTelemetry initOpenTelemetry() {
    // Include required service.name resource attribute on all spans and metrics
    Resource resource =
        Resource.getDefault()
            .merge(Resource.builder().put(SERVICE_NAME, "OtlpExporterExample").build());

    PeriodicMetricReader metricReader =
        PeriodicMetricReader.builder(
                OtlpHttpMetricExporter.builder()
                    // Use your GreptimeDB address here
                    .setEndpoint("http://127.0.0.1:4000/v1/otlp/v1/metrics")
                    .build())
            .setInterval(Duration.ofMillis(5000))
            .build();

    SdkMeterProvider meterProvider =
        SdkMeterProvider.builder().setResource(resource).registerMetricReader(metricReader).build();

    OpenTelemetrySdk openTelemetrySdk =
        OpenTelemetrySdk.builder().setMeterProvider(meterProvider).buildAndRegisterGlobal();

    Runtime.getRuntime().addShutdownHook(new Thread(openTelemetrySdk::close));

    return openTelemetrySdk;
  }

直接使用 OpenTelemetry 的 API 采集指标数据,例如:

java
OpenTelemetry openTelemetry = initOpenTelemetry();

Attributes attrs = Attributes.builder().put("host", "testhost").build();

Meter sampleMeter = openTelemetry.getMeter("io.opentelemetry.example.metrics");
sampleMeter
    .gaugeBuilder("jvm.memory.free")
    .setDescription("Reports JVM memory usage.")
    .setUnit("byte")
    .buildWithCallback(result -> result.record(Runtime.getRuntime().freeMemory(), attrs));

采集到的指标将每 5 秒写入 GreptimeDB 一次。由于 GreptimeDB 兼容 MySQL 协议,我们可以使用 MySQL 客户端读取数据:

MySQL [public]> select * from jvm_memory_free;
+---------------------+------------------------+--------------------+-----------------------+----------+-------------------------+----------------+
| service_name        | telemetry_sdk_language | telemetry_sdk_name | telemetry_sdk_version | host     | greptime_timestamp      | greptime_value |
+---------------------+------------------------+--------------------+-----------------------+----------+-------------------------+----------------+
| OtlpExporterExample | java                   | opentelemetry      | 1.28.0                | testhost | 2023-08-14 15:55:55.938 |      221367384 |
| OtlpExporterExample | java                   | opentelemetry      | 1.28.0                | testhost | 2023-08-14 15:56:00.936 |      235219040 |
| OtlpExporterExample | java                   | opentelemetry      | 1.28.0                | testhost | 2023-08-14 15:56:05.937 |      235219040 |
+---------------------+------------------------+--------------------+-----------------------+----------+-------------------------+----------------+
3 rows in set (0.011 sec)

总结 ​

值得一提的是,OTLP 除了是一个信息量丰富的面向可观测场景的数据协议之外,还是一个比较典型的 push-based 协议,可以方便用户直接从应用将数据写入 GreptimeDB 。随着 GreptimeDB 支持的数据类型和场景增加,我们还会和 OTLP 的其他数据类型有更深入的结合。

目前 OTLP 协议的支持也发布在 GreptimeCloud 上,开通新的,或使用已有的 GreptimeCloud 实例可以直接体验。我们还编写了多种语言的 OTLP 示例方便用户上手。

关于 Greptime ​

Greptime 格睿科技专注于为可观测、物联网及车联网等领域提供实时、高效的数据存储和分析服务,帮助客户挖掘数据的深层价值。目前基于云原生的时序数据库 GreptimeDB 已经衍生出多款适合不同用户的解决方案,更多信息或 demo 展示请联系下方小助手(微信号:greptime)。

欢迎对开源感兴趣的朋友们参与贡献和讨论,从带有 good first issue 标签的 issue 开始你的开源之旅吧~期待在开源社群里遇见你!添加小助手微信即可加入“技术交流群”与志同道合的朋友们面对面交流哦~

Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb

官网:https://greptime.cn/

文档:https://docs.greptime.cn/

Twitter: https://twitter.com/Greptime

Slack: https://greptime.com/slack

LinkedIn: https://www.linkedin.com/company/greptime/

Stay in the loop

加入我们的社区