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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Opentelemetry

OTEL 是 OpenTelemetry 的简称 是 CNCF 的一个可观测性项目旨在提供可观测性领域的标准化方案解决观测数据的数据模型、采集、处理、导出等的标准化问题提供与三方 vendor 无关的服务。
OpenTelemetry 是一组标准和工具的集合旨在管理观测类数据如 Traces、Metrics、Logs 等 (未来可能有新的观测类数据类型出现)。目前已经是业内的标准。
在这里插入图片描述

1. 三个基本概念

1.1 Tracing

opentelemetry可以将trace的数据发送到jaeger去
Tracing 提供了从请求开始接收到处理完毕的整个生命周期的全貌。使用span最为跟踪数据生成信息元数据
在这里插入图片描述

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 自动执行这项任务将为运维人员节省大量的时间。
在这里插入图片描述

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

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

  • Rate你的服务每秒钟所提供的请求数。
    例如: QPSQueries 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 日志工具
实现了链路追踪自动关联日志的功能

  • 三种常用logLog:语言内置logruszap
    在这里插入图片描述

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-protohttps://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 等发送到一个或多个开源或商业后端。此外收集器让最终用户可以控制他们的数据。收集器是默认位置检测库导出其遥测数据。
在这里插入图片描述
在这里插入图片描述
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 导出器将数据打印到日志中。
    OTLPOpenTelemetry 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 是在观测性和监控领域中使用的一些工具它们可以相互配合使用以提供全面的监控和观测能力。

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

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

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

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

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6