写点什么

OpenTelemetry:新一代的开源可观测性标准

  • 2024-08-15
    浙江
  • 本文字数:4062 字

    阅读完需:约 13 分钟

OpenTelemetry:新一代的开源可观测性标准

OpenTelemetry 是由 OpenTracing 和 OpenCensus 两个开源项目合并而成,由云原生计算基金会(CNCF)托管。该项目旨在提供一套标准化的、跨语言的观测性工具,帮助开发人员和运维人员更好地理解和管理分布式系统的性能和行为。通过统一的 Metrics(指标)、Logs(日志)和 Traces(追踪)数据模型,OpenTelemetry 使得数据收集、处理和分析变得更加高效和便捷。

OpenTelemetry 的核心组成部分

1.日志(Logs)

日志是系统运行时事件的记录,包含了丰富的上下文信息,对于理解和调试应用程序的行为至关重要。OpenTelemetry 的 Log API 定义了一种标准方式来记录和导出这些事件,确保了日志数据的一致性和可读性。

OpenTelemetry 日志的标准格式通常包括以下几个部分:资源、日志记录、时间戳和日志内容。以下是一个示例,展示了如何使用 OpenTelemetry 收集和导出日志数据。


示例数据样例

{  "resource": {    "attributes": {      "service.name": "example-service",      "service.instance.id": "instance-1",      "host.name": "host1"    }  },  "instrumentationLibraryLogs": [    {      "instrumentationLibrary": {        "name": "example-instrumentation",        "version": "1.0.0"      },      "logs": [        {          "timeUnixNano": "1633046460000000000",          "severityText": "INFO",          "name": "example-log",          "body": "This is an example log message",          "attributes": {            "http.method": "GET",            "http.status_code": "200"          }        },        {          "timeUnixNano": "1633046465000000000",          "severityText": "ERROR",          "name": "example-error-log",          "body": "This is an example error log message",          "attributes": {            "http.method": "POST",            "http.status_code": "500"          }        }      ]    }  ]}
复制代码


字段解释

  • resource: 描述了生成这些日志的资源信息,如服务名称、实例 ID 和主机名。

  • instrumentationLibraryLogs: 包含了仪表库的信息和相关的日志数据。

  • instrumentationLibrary: 描述了仪表库的名称和版本。

  • logs: 包含了具体的日志数据。

  • timeUnixNano: 日志记录的时间戳(纳秒)。

  • severityText: 日志的严重性级别(如 INFO、ERROR 等)。

  • name: 日志的名称。

  • body: 日志的内容。

  • attributes: 日志的属性,如 HTTP 方法和状态码。


2.指标(Metrics)

指标是对系统性能、资源使用情况等量化数据的度量。OpenTelemetry Metrics API 使开发者能够计量特定事件的发生频率或资源的消耗量,并以标准格式暴露给监控系统,支持实时性能监控和趋势分析。

OpenTelemetry 指标的标准格式通常包括以下几个部分:资源、仪表、时间序列和数据点。以下是一个示例,展示了如何使用 OpenTelemetry 收集和导出指标数据。


示例数据样例

{  "resource": {    "attributes": {      "service.name": "example-service",      "service.instance.id": "instance-1",      "host.name": "host1"    }  },  "instrumentationLibraryMetrics": [    {      "instrumentationLibrary": {        "name": "example-instrumentation",        "version": "1.0.0"      },      "metrics": [        {          "name": "http_requests_total",          "description": "Total number of HTTP requests",          "unit": "1",          "data": {            "sum": {              "dataPoints": [                {                  "attributes": {                    "http.method": "GET",                    "http.status_code": "200"                  },                  "startTimeUnixNano": "1633046400000000000",                  "timeUnixNano": "1633046460000000000",                  "value": 100                },                {                  "attributes": {                    "http.method": "POST",                    "http.status_code": "500"                  },                  "startTimeUnixNano": "1633046400000000000",                  "timeUnixNano": "1633046460000000000",                  "value": 5                }              ]            }          }        }      ]    }  ]}
复制代码


字段解释

  • resource: 描述了生成这些指标的资源信息,如服务名称、实例 ID 和主机名。

  • instrumentationLibraryMetrics: 包含了仪表库的信息和相关的指标数据。

  • instrumentationLibrary: 描述了仪表库的名称和版本。

  • metrics: 包含了具体的指标数据。

  • name: 指标的名称。

  • description: 指标的描述。

  • unit: 指标的单位。

  • data: 指标的数据类型,这里使用的是 sum 类型。

  • dataPoints: 包含了具体的数据点。

  • attributes: 数据点的属性,如 HTTP 方法和状态码。

  • startTimeUnixNano: 数据点的开始时间(纳秒)。

  • timeUnixNano: 数据点的结束时间(纳秒)。

  • value: 数据点的值。


3.调用链(Traces)

调用链追踪是理解分布式系统中请求流经各服务的路径和耗时的关键。OpenTelemetry Traces API 提供了一套机制,用于捕获和记录服务间的调用关系,形成了服务调用的完整视图,极大地提升了故障排查的效率。

OpenTelemetry Trace 的标准格式通常包括以下几个部分:资源、Span、时间戳和属性。以下是一个示例,展示了如何使用 OpenTelemetry 收集和导出 Trace 数据。


示例数据样例

{  "resource": {    "attributes": {      "service.name": "example-service",      "service.instance.id": "instance-1",      "host.name": "host1"    }  },  "instrumentationLibrarySpans": [    {      "instrumentationLibrary": {        "name": "example-instrumentation",        "version": "1.0.0"      },      "spans": [        {          "traceId": "4bf92f3577b34da6a3ce929d0e0e4736",          "spanId": "00f067aa0ba902b7",          "parentSpanId": "b9c7c989f97918e1",          "name": "example-span",          "kind": "SPAN_KIND_INTERNAL",          "startTimeUnixNano": "1633046400000000000",          "endTimeUnixNano": "1633046460000000000",          "attributes": {            "http.method": "GET",            "http.status_code": "200"          },          "status": {            "code": "STATUS_CODE_OK"          }        },        {          "traceId": "4bf92f3577b34da6a3ce929d0e0e4736",          "spanId": "f2cda95b0b1c4a3a",          "parentSpanId": "00f067aa0ba902b7",          "name": "example-child-span",          "kind": "SPAN_KIND_CLIENT",          "startTimeUnixNano": "1633046410000000000",          "endTimeUnixNano": "1633046450000000000",          "attributes": {            "db.system": "mysql",            "db.statement": "SELECT * FROM users"          },          "status": {            "code": "STATUS_CODE_OK"          }        }      ]    }  ]}
复制代码


字段解释

  • resource: 描述了生成这些 Trace 的资源信息,如服务名称、实例 ID 和主机名。

  • instrumentationLibrarySpans: 包含了仪表库的信息和相关的 Span 数据。

  • instrumentationLibrary: 描述了仪表库的名称和版本。

  • spans: 包含了具体的 Span 数据。

  • traceId: Trace 的唯一标识符。

  • spanId: Span 的唯一标识符。

  • parentSpanId: 父 Span 的标识符(如果有)。

  • name: Span 的名称。

  • kind: Span 的类型(如 INTERNAL、CLIENT 等)。

  • startTimeUnixNano: Span 的开始时间(纳秒)。

  • endTimeUnixNano: Span 的结束时间(纳秒)。

  • attributes: Span 的属性,如 HTTP 方法和状态码。

  • status: Span 的状态码。

OpenTelemetry 的优势

1.标准化:

OpenTelemetry 通过提供统一的数据模型和接口,打破了不同厂商和平台之间的壁垒,使得遥测数据可以在不同系统间无缝流动。这大大降低了数据迁移和集成的难度,提高了系统的可观测性和可维护性。

2.跨语言支持:

OpenTelemetry 支持多种编程语言,如 Java、Python、Go 等。这使得开发人员可以在不同语言编写的应用程序中使用 OpenTelemetry 进行分布式追踪和性能监控,实现跨语言追踪和统一观测。


3.易于集成和扩展:

OpenTelemetry 提供了丰富的 SDK 和 Collector 实现,使得它可以轻松集成到现有的应用程序和服务中。同时,OpenTelemetry 还支持自定义数据收集器和处理器,满足特定需求的数据收集和处理。



4.强大的社区支持:

作为 CNCF 的孵化项目,OpenTelemetry 得到了广泛的社区支持和持续的更新。这使得 OpenTelemetry 能够不断迭代和优化,为开发人员和运维人员提供更好的观测性体验。

5.与现有标准的兼容性:

兼容现有的监控和追踪标准,如 OpenTracing 和 OpenCensus,确保了向新标准的平滑过渡。


OpenTelemetry 的应用场景

通过集成 OpenTelemetry SDK,应用可以自动收集详细的性能数据和调用链路信息,这些数据随后被导出至 Prometheus、Jaeger 或 Elasticsearch 等后端存储与分析系统。

在微服务架构中,OpenTelemetry 可以用于追踪一个请求经过的所有服务,帮助开发者快速定位问题所在。

在云原生应用中,OpenTelemetry 可以监控容器化应用的性能和资源使用情况,及时发现潜在问题。

在物联网设备中,OpenTelemetry 可以收集远程设备的运行状态信息,为设备的维护和优化提供数据支持。

结论

OpenTelemetry 作为新一代的开源观测性标准,为开发人员和运维人员提供了一种统一、高效、跨语言的观测性解决方案。通过标准化的数据模型和接口、跨语言支持、易于集成和扩展以及强大的社区支持等优势,OpenTelemetry 正在逐步成为分布式追踪、日志收集和性能指标监控的主流方案。随着 OpenTelemetry 的不断发展和完善,相信它将在未来的软件开发和运维领域发挥更加重要的作用。


发布于: 刚刚阅读数: 5
用户头像

聚焦数字化可观测赛道 2023-06-25 加入

让您的业务运行更安全更稳定

评论

发布
暂无评论
OpenTelemetry:新一代的开源可观测性标准_开源_乘云数字DataBuff_InfoQ写作社区