opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用

Opentelemetry

OTEL 是 OpenTelemetry 的简称, 是 CNCF 的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题,提供与三方 vendor 无关的服务。
OpenTelemetry 是一组标准和工具的集合,旨在管理观测类数据,如 Traces、Metrics、Logs 等 (未来可能有新的观测类数据类型出现)。目前已经是业内的标准。
opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用_第1张图片

1. 三个基本概念

1.1 Tracing

opentelemetry可以将trace的数据发送到jaeger去
Tracing 提供了从请求开始接收到处理完毕的整个生命周期的全貌。使用span最为跟踪数据,生成信息(元数据)
opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用_第2张图片

obs-opentelemetry 实现了什么:

- 支持在 hertz 服务端和客户端之间启用 http 链路追踪
- 支持通过设置 http header 以启动自动透明地传输对端服务

使用示例

package main

import (
    "github.com/cloudwego/hertz/pkg/app/server"
    hertztracing "github.com/hertz-contrib/obs-opentelemetry/tracing"
)

func main() {
    tracer, cfg := hertztracing.NewServerTracer()
    h := server.Default(tracer)
    h.Use(hertztracing.ServerMiddleware(cfg))
    // ...
    h.Spin()
}

1.2 Metric

简单说,cpu、内存、运行时候的信息,可以==通过Prometheus+导出器搞定 ==(发过去)

度量指标(Metric)包含了各种各样的方法和实现。

Metric 包括了追踪样本以及自动将指标与产生它们的追踪样本联系起来。手动将指标和追踪联系起来往往是一项繁琐且容易出错的任务。OpenTelemetry 自动执行这项任务将为运维人员节省大量的时间。
opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用_第3张图片

  • grafana与Prometheus
    Grafana是一个开源的可视化平台,用于创建、查询和展示时序数据的仪表盘和图表。它支持多种数据源,其中包括Prometheus。Grafana提供了丰富的可视化选项和灵活的仪表盘配置,可以根据需求创建各种类型的监控指标图表。借助Grafana,用户可以通过图表、面板和警报来监视和分析数据,并以直观和易于理解的方式展示。
    因此,Prometheus是一个用于收集和分析时间序列数据的监测系统,而Grafana是一个用于可视化和展示这些数据的工具。两者可以结合使用,使用户能够实时监控系统的性能、状态和指标,并通过仪表盘和图表直观地展示这些数据。

  • obs-opentelemetry 实现了什么:R.E.D (Rate, Errors, Duration) 定义了架构中的每个微服务测量的三个关键指标。OpenTelemetry 可以根据http.server.duration来计算R.E.D。

  • Rate:你的服务每秒钟所提供的请求数。
    例如: QPS(Queries Per Second)每秒查询率

sum(rate(http_server_duration_count{}[5m])) by (service_name, http_method)
  • Error:每秒失败的请求数。

例如:错误率

sum(rate(http_server_duration_count{status_code="Error"}[5m])) by (service_name, http_method) / 
sum(rate(http_server_duration_count{}[5m])) by (service_name, http_method)
  • Duration
    例如:P99 Latency
histogram_quantile(0.99, sum(rate(http_server_duration_bucket{}[5m])) by (le, service_name, http_method))

1.3 Logging

opentelemetry 发送到rockeyMQ等
在 logrus 的基础上适配了 hertz 日志工具
实现了链路追踪自动关联日志的功能

  • 三种常用log:Log:语言内置,logrus,zap
    opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用_第4张图片

2. 实现

2.1 docker-compose 部署依赖 && otel-collector 配置文件

docker-compse

version: "3.7"
services:

#  # Collector
  otel-collector:
    image: otel/opentelemetry-collector-contrib-dev:latest
    command: [ "--config=/etc/otel-collector-config.yaml", "${OTELCOL_ARGS}" ]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "1888:1888"   # pprof extension
      - "8888"   # Prometheus metrics exposed by the collector
      - "8889:8889"   # Prometheus exporter metrics
      - "13133:13133" # health_check extension
      - "4317:4317"   # OTLP gRPC receiver
      - "55679" # zpages extension
    depends_on:
      - jaeger-all-in-one

  # Jaeger
  jaeger-all-in-one:
    image: jaegertracing/all-in-one:latest
    environment:
      - COLLECTOR_OTLP_ENABLED=true
    ports:
      - "16686:16686"
      - "14268"
      - "14250:14250"
      - "6831:6831"
    #  - "4317:4317"   # OTLP gRPC receiver

  # Victoriametrics
  victoriametrics:
    container_name: victoriametrics
    image: victoriametrics/victoria-metrics
    ports:
      - "8428:8428"
      - "8089:8089"
      - "8089:8089/udp"
      - "2003:2003"
      - "2003:2003/udp"
      - "4242:4242"
    command:
      - '--storageDataPath=/storage'
      - '--graphiteListenAddr=:2003'
      - '--opentsdbListenAddr=:4242'
      - '--httpListenAddr=:8428'
      - '--influxListenAddr=:8089'
    restart: always

  # Grafana
  grafana:
    image: grafana/grafana:latest
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_AUTH_DISABLE_LOGIN_FORM=true
    ports:
      - "3000:3000"

otel-collector-config.yml

receivers:
  otlp:
    protocols:
      grpc:

exporters:
  prometheusremotewrite:
    endpoint: "http://victoriametrics:8428/api/v1/write"

  logging:
  
  otlp:
    endpoint: jaeger-all-in-one:4317
    tls:
      insecure: true


processors:
  batch:

extensions:
  health_check:
  pprof:
    endpoint: :1888
  zpages:
    endpoint: :55679

service:
  extensions: [ pprof, zpages, health_check ]
  pipelines:
    traces:
      receivers: [ otlp ]
      processors: [ batch ]
      exporters: [ logging, otlp ]
    metrics:
      receivers: [ otlp ]
      processors: [ batch ]
      exporters: [ logging, prometheusremotewrite ]

2.2 OTLP(OpenTelemetry Protocol )

OTLP(全称 OpenTelemetry Protocol )是 OpenTelemetry 原生的遥测信号传递协议,虽然在 OpenTelemetry 的项目中组件支持了Zipkin v2或Jaeger Thrift的协议格式的实现,但是都是以第三方贡献库的形式提供的。只有 OTLP 是 OpenTelemetry 官方原生支持的格式。OTLP 的数据模型定义是基于 ProtoBuf 完成的,如果你需要实现一套可以收集 OTLP 遥测数据的后端服务,那就需要了解里面的内容,对应可以参考代码仓库:opentelemetry-proto(https://github.com/open-telemetry/opentelemetry-proto)

otel-collector-config 中指定接收器部分,定义了数据如何被接收。在这里配置了 otlp 接收器,使用 gRPC 协议进行通信。

receivers:
  otlp:
    protocols:
      grpc:

2.3 Opentelemetry-Collector

OpenTelemetry Collector (以下简称“otel-collector”)针对如何接收、处理和导出遥测数据提供了与供应商无关的实现。它消除了运行、操作和维护多个代理/收集器的需要,以支持将开源可观察性数据格式(例如 Jaeger、Prometheus 等)发送到一个或多个开源或商业后端。此外,收集器让最终用户可以控制他们的数据。收集器是默认位置检测库导出其遥测数据。
opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用_第5张图片
opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用_第6张图片
docker中的部署

version: "3.7"
services:

#  # Collector
  otel-collector:
    image: otel/opentelemetry-collector-contrib-dev:latest
    command: [ "--config=/etc/otel-collector-config.yaml", "${OTELCOL_ARGS}" ]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "1888:1888"   # pprof extension
      - "8888"   # Prometheus metrics exposed by the collector
      - "8889:8889"   # Prometheus exporter metrics
      - "13133:13133" # health_check extension
      - "4317:4317"   # OTLP gRPC receiver
      - "55679" # zpages extension
    depends_on:
      - jaeger-all-in-one

2.4 otel-exporter、service

exporters:

  prometheusremotewrite:
    endpoint: "http://victoriametrics:8428/api/v1/write"

  logging:

  otlp:
    endpoint: jaeger-all-in-one:4317
    tls:
      insecure: true
...
service:
  extensions: [ pprof, zpages, health_check ]
  pipelines:
    traces:
      receivers: [ otlp ]
      processors: [ batch ]
      exporters: [ logging, otlp ] # 通过otlp导出给jaeger
    metrics:
      receivers: [ otlp ]
      processors: [ batch ]
      exporters: [ logging, prometheusremotewrite ]
  • exporters:
    导出器部分,定义了数据如何被导出。在这里配置了三个导出器,分别是 prometheusremotewrite 、logging、 通过otlp导出到jaeger。
    prometheusremotewrite 导出器用于将指标数据导出到远程写入的 Prometheus 实例,而 logging 导出器将数据打印到日志中。
    OTLP(OpenTelemetry Protocol)导出器,它将数据导出到指定的 endpoint 中。在这里,endpoint 被配置为 jaeger-all-in-one:4317,即使用 jaeger-all-in-one 全部集成的 Jaeger 实例作为终端节点。此外,还配置了一个 tls 字段,表示该导出器是否启用 TLS/SSL 加密传输。
  • service:
    服务部分,定义了整个服务的配置。在这里配置了使用的扩展以及数据的流程。其中 pipelines 部分定义了多个数据流程,包括 traces 和 metrics。每个数据流程都有对应的接收器、处理器和导出器。

2.5 opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 之间关系

OpenTelemetry、Grafana、Prometheus、Jaeger和VictoriaMetrics 是在观测性和监控领域中使用的一些工具,它们可以相互配合使用以提供全面的监控和观测能力。

  • OpenTelemetry:OpenTelemetry 是一个开源的观测性框架,用于在分布式系统中收集、处理和导出跟踪数据、指标数据和日志数据。它提供了一组库和工具,使开发人员能够在应用程序中插入代码以生成和导出数据,以便进行分析和监控。

  • Grafana:Grafana 是一个流行的开源数据可视化工具,用于创建、查询和可视化各种数据源中的监控指标、日志和其他数据。Grafana 提供了丰富的可视化选项和仪表板功能,使用户能够根据需要自定义显示和分析数据。

  • Prometheus:Prometheus 是一个开源的系统监控和警报工具,用于收集和存储时间序列数据。它具有内置的数据模型和查询语言,可对指标进行高效的存储和查询。Prometheus 支持各种数据源的数据采集,并和Grafana配合使用,可以创建实时监控仪表板,并进行数据可视化和警报。

  • Jaeger:Jaeger 是一个开源的分布式追踪系统,用于收集、存储和查询分布式应用程序的跟踪数据。它可以帮助开发人员理解应用程序中的服务调用关系和性能瓶颈。Jaeger 与 OpenTelemetry 配合使用,提供了对分布式跟踪数据的收集和展示功能。

  • VictoriaMetrics:VictoriaMetrics 是一个高性能、开源的时间序列数据库和监控系统,在处理大规模时间序列数据时表现出色。它兼容 Prometheus 的数据模型和查询语言,并提供了高度可扩展的存储和查询能力。可以将其作为 Prometheus 的后端存储,用于长期存储和检索时间序列数据。(可以代替Prometheus斜体样式

综上所述,OpenTelemetry 用于收集、处理和导出观测性数据,Prometheus 和 VictoriaMetrics 用于存储和查询时间序列数据,Grafana 用于将数据进行可视化展示,而 Jaeger 则用于收集和展示分布式追踪数据。这些工具可以相互配合使用,以构建全面的监控和观测解决方案。

你可能感兴趣的:(grafana,prometheus)