欢迎参与 8 月 1 日中午 11 点的线上分享,了解 GreptimeDB 联合处理指标和日志的最新方案! 👉🏻 点击加入

Skip to content
On this page
技术
2023-8-17

GreptimeDB 正式支持 OpenTelemetry OTLP Metric 采集

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

OpenTelemetry 致力于提供一套的 API 和 SDK 帮助云原生应用搭建可以独立实现的标准化 Observability 能力。其中 OTLP 是 OpenTelmetry 定义的一套可观测性数据的编码和传输协议。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 提供了多种语言的客户端实现,包括 JavaPythonGoJavaScriptRust 等等,让开发者可以快速接入。

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/

加入我们的社区

获取 Greptime 最新更新,并与其他用户讨论。