OpenTelemetry 致力于提供一套的 API 和 SDK 帮助云原生应用搭建可以独立实现的标准化 Observability 能力。其中 OTLP 是 OpenTelmetry 定义的一套可观测性数据的编码和传输协议。OTLP 协议在今年 7 月正式发布了 1.0.0 版本。为了方便使用 OpenTelemetry 框架采集可观测数据的用户,我们现已在 GreptimeDB 上支持了 OTLP Metric 数据的写入。
什么是 OTLP
OpenTelemetry 将可观测数据的生命周期定义为三个环节:起源、传输和落盘状态。其中 OTLP 主要负责衔接来源和落盘的流程,它对可观测领域的数据类型做了建模,并且定义了数据请求响应的协议。
当前市面上存在多套可观测数据的传输协议,但大多来自某个特定实现的定义,比如 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 采集器地址上:
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 采集指标数据,例如:
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
Twitter: https://twitter.com/Greptime
Slack: https://greptime.com/slack