如何解析开放遥测 0.7.0 消息 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

如何解析开放遥测 0.7.0 消息

本部分提供帮助您开始解析 Open遥测 0.7.0 的信息。

首先,您应该获得特定于语言的绑定,这使您能够以您的首选语言解析 Open遥测 0.7.0 消息。

获取语言特定的绑定

  • 这些步骤取决于您的首选语言。

    • 要使用 Java,请将以下 Maven 依赖项添加到 Java 项目中:开放遥测 Java >> 0.14.1

    • 若要使用任何其他语言,请按照下列步骤操作:

      1. 确保支持您的语言,方法是检查生成您的类

      2. 按照中的下列步骤安装 Protobuf 编译器下载协议缓冲区

      3. 下载开放遥测 0.7.0 原始 Buf 定义,网址为v0.7.0 发行版

      4. 确认您位于下载的 Open遥测 0.7.0 ProtoBuf 定义的根文件夹中,然后运行命令以生成特定于语言的绑定。有关更多信息,请参阅 。生成您的类

        以下是介绍如何生成 Javascript 绑定的示例。

        protoc --proto_path=./ --js_out=import_style=commonjs,binary:src \ opentelemetry/proto/common/v1/common.proto \ opentelemetry/proto/resource/v1/resource.proto \ opentelemetry/proto/metrics/v1/metrics.proto

以下部分包括使用特定于语言的绑定的示例,您可以使用前面的说明来构建这些绑定。

Java

package com.example; import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class MyOpenTelemetryParser { public List<ExportMetricsServiceRequest> parse(InputStream inputStream) throws IOException { List<ExportMetricsServiceRequest> result = new ArrayList<>(); ExportMetricsServiceRequest request; /* A Kinesis record can contain multiple `ExportMetricsServiceRequest` records, each of them starting with a header with an UnsignedVarInt32 indicating the record length in bytes: ------ --------------------------- ------ ----------------------- |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService... ------ --------------------------- ------ ----------------------- */ while ((request = ExportMetricsServiceRequest.parseDelimitedFrom(inputStream)) != null) { // Do whatever we want with the parsed message result.add(request); } return result; } }

JavaScript

此示例假定带有生成绑定的根文件夹为./

函数的数据参数parseRecord可以是下列类型之一:

  • Uint8Array这是最佳

  • Buffer节点下的最佳

  • Array.number8 位整数

const pb = require('google-protobuf') const pbMetrics = require('./opentelemetry/proto/collector/metrics/v1/metrics_service_pb') function parseRecord(data) { const result = [] // Loop until we've read all the data from the buffer while (data.length) { /* A Kinesis record can contain multiple `ExportMetricsServiceRequest` records, each of them starting with a header with an UnsignedVarInt32 indicating the record length in bytes: ------ --------------------------- ------ ----------------------- |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService... ------ --------------------------- ------ ----------------------- */ const reader = new pb.BinaryReader(data) const messageLength = reader.decoder_.readUnsignedVarint32() const messageFrom = reader.decoder_.cursor_ const messageTo = messageFrom + messageLength // Extract the current `ExportMetricsServiceRequest` message to parse const message = data.subarray(messageFrom, messageTo) // Parse the current message using the ProtoBuf library const parsed = pbMetrics.ExportMetricsServiceRequest.deserializeBinary(message) // Do whatever we want with the parsed message result.push(parsed.toObject()) // Shrink the remaining buffer, removing the already parsed data data = data.subarray(messageTo) } return result }

Python

您必须阅读var-int分隔符或使用内部方法_VarintBytes(size)_DecodeVarint32(buffer, position)。这些返回缓冲区中大小字节之后的位置。读取端构建一个新的缓冲区,该缓冲区仅限于读取消息的字节。

size = my_metric.ByteSize() f.write(_VarintBytes(size)) f.write(my_metric.SerializeToString()) msg_len, new_pos = _DecodeVarint32(buf, 0) msg_buf = buf[new_pos:new_pos+msg_len] request = metrics_service_pb.ExportMetricsServiceRequest() request.ParseFromString(msg_buf)

转到

使用 Buffer.DecodeMessage()

C#

使用 CodedInputStream。此类可以读取大小分隔的消息。

C++

中描述的函数google/protobuf/util/delimited_message_util.h可以读取大小分隔的消息。

其他语言

有关使用其他语言,请参阅下载协议缓冲区

在实现解析器时,请考虑一个 Kinesis 记录可以包含多个ExportMetricsServiceRequest协议缓冲消息,每个消息都以UnsignedVarInt32,表示记录长度(字节)。