Grafana 系列文章(一):基于 Grafana 的全栈可观察性 Demo

news2024/9/23 15:22:52

📚️Reference:

https://github.com/grafana/intro-to-mlt

这是关于 Grafana 中可观察性的三个支柱的一系列演讲的配套资源库。

它以一个自我封闭的 Docker 沙盒的形式出现,包括在本地机器上运行和实验所提供的服务所需的所有组件。

Grafana 全栈可观察性产品

Grafana 全栈可观察性

具体的可观察性转换图

可观察性转换图

前提

  • Docker
  • Docker Compose

概述

这个系列的演示是基于这个资源库中的应用程序和代码,其中包括:

  • Docker Compose 清单,便于设置。
  • 三种服务的应用:
    • 一个从 REST API 服务器请求数据的服务。
    • 一个接收请求的 REST API 服务器,并利用数据库来存储/检索这些请求的数据。
    • 一个用于存储/检索数据的 Postgres 数据库。
  • Tempo 实例用于存储 trace 信息。
  • Loki 实例,用于存储日志信息。
  • 普罗米修斯(Prometheus)实例,用于存储度量 (Metrics) 信息。
  • Grafana 实例,用于可视化可观察性信息。
  • Grafana Agent 实例,用于接收 trace,并根据这些 trace 产生度量和日志。
  • 一个 Node Exporter 实例,用于从本地主机检索资源度量。

运行演示环境

Docker Compose 将下载所需的 Docker 镜像,然后启动演示环境。数据将从微服务应用中发射出来,并存储在 Loki、Tempo 和 Prometheus 中。你可以登录到 Grafana 实例,将这些数据可视化。要执行环境并登录。

  1. 在你的操作系统中启动一个新的命令行界面并运行:

    docker-compose up
  2. 登录到本地的 Grafana 实例,网址是:http://localhost:3000/ 注意:这是假设 3000 端口还没有被使用。如果这个端口没有空闲,请编辑docker-compose.yml文件,并修改这一行

    - "3000:3000"

    到其他一些空闲的主机端口,例如:

    - "3123:3000"
  3. 访问 MLT dashboard. (MLT: Metrics/Logging/Tracing)

  4. 使用 Grafana Explorer 访问数据源。

🐾 注意:

对于中国区用户,可以在需要 build 的部分加上 proxy, 如下:

  mythical-requester:
    build:
      context: ./source
      dockerfile: docker/Dockerfile
      args:
        HTTP_PROXY: http://192.168.2.9:7890
        HTTPS_PROXY: http://192.168.2.9:7890
        SERVICE: mythical-beasts-requester

  mythical-server:
    build:
      context: ./source
      dockerfile: docker/Dockerfile
      args:
        HTTP_PROXY: http://192.168.2.9:7890
        HTTPS_PROXY: http://192.168.2.9:7890              
        SERVICE: mythical-beasts-server

  prometheus:
    build: 
      context: ./prometheus
      args:
        HTTP_PROXY: http://192.168.2.9:7890
        HTTPS_PROXY: http://192.168.2.9:7890    

Grafana

Grafana 是一个可视化工具,允许从各种数据源创建仪表盘。更多信息可以在这里 找到。

Grafana 实例在docker-compose.yml清单的 grafana 部分有描述。

  # The Grafana dashboarding server.
  grafana:
    image: grafana/grafana
    volumes:
      - "./grafana/definitions:/var/lib/grafana/dashboards"
      - "./grafana/provisioning:/etc/grafana/provisioning"
    ports:
      - "3000:3000"
    environment:
      - GF_FEATURE_TOGGLES_ENABLE=tempoSearch,tempoServiceGraph

它:

  • 挂载两个资源库目录,为数据提供预置的数据源 (./grafana/provisioning/datasources.yaml)。
  • 预置的仪表盘,用于关联指标、日志和跟踪。(./grafana/definitions/mlt.yaml)
  • 为本地登录提供3000端口。
  • 启用两个 Tempo 功能,即跨度搜索 (span search) 和服务图支持 (service graph support)。

不使用自定义配置。

📚️ Reference:

格拉法纳代理|格拉法纳实验室 (grafana.com)

  • 「它通常用作跟踪管道,从应用程序卸载(offloading )跟踪并将其转发到存储后端。Grafana Agent 跟踪堆栈是使用 OpenTelemetry 构建的。」
  • 「Grafana Agent 支持以多种格式接收跟踪:OTLP(OpenTelemetry),Jaeger,Zipkin 和 OpenCensus。」

从跨度生成指标 |格拉法纳实验室 (grafana.com)

Prometheus

普罗米修斯是一个后台存储和服务,用于从各种来源刮取(拉取)指标数据。更多信息可以在 这里 找到。此外,Mimir 是 Prometheus 数据的长期保留存储,关于它的信息可以在 这里 找到。

Prometheus 实例在docker-compose.yml清单的prometheus部分有描述。

  prometheus:
    build: 
      context: ./prometheus
      args:
        HTTP_PROXY: http://192.168.2.9:7890
        HTTPS_PROXY: http://192.168.2.9:7890    
    ports:
      - "9090:9090"

它是由prometheus目录下的一个修改过的 Dockerfile 构建的。这将配置文件复制到新的镜像中,并通过修改启动时使用的命令字符串来启用一些功能(包括 Exemplar 支持 - "--enable-feature=exemplar-storage")。普罗米修斯在 9090 端口暴露其主要接口。

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

remote_read:
scrape_configs:
  # Scrape Prometheus' own metrics.
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
        labels:
          group: 'prometheus'

  # Scrape from the Mythical Server service.
  - job_name: 'mythical-server'
    scrape_interval: 2s
    static_configs:
      - targets: ['mythical-server:4000']
        labels:
          group: 'mythical'

  # Scrape from the Mythical Requester service.
  - job_name: 'mythical-requester'
    scrape_interval: 2s
    static_configs:
      - targets: ['mythical-requester:4001']
        labels:
          group: 'mythical'

  # Scrape from the Node exporter, giving us resource usage.
  - job_name: 'node'
    scrape_interval: 5s
    static_configs:
      - targets: ['nodeexporter:9100']
        labels:
          group: 'resources'

  # Scrape from Grafana Agent, giving us metrics from traces it collects.
  - job_name: 'span-metrics'
    scrape_interval: 2s
    static_configs:
      - targets: ['agent:12348']
        labels:
          group: 'mythical'

  # Scrape from Grafana Agent, giving us metrics from traces it collects.
  - job_name: 'agent-metrics'
    scrape_interval: 2s
    static_configs:
      - targets: ['agent:12345']
        labels:
          group: 'mythical'

配置文件(prometheus/prometheus.yml)定义了几个 scrape 工作,包括。

  • 从 Prometheus 实例本身检索指标。(job_name: 'prometheus')

  • 从微服务应用中获取指标。(job_name: 'mythical-server'job_name: 'mythical-requester')

  • 来自已安装的 Node Exporter 实例的指标。(job_name: 'node')

  • 来自 Grafana Agent 的指标,由传入的跟踪数据得出。(job_name: 'span-metrics')

📚️References:

Exemplars storage | Prometheus Docs

  • 「OpenMetrics 引入了刮取目标的能力,可以将范例 (Exemplars) 添加到特定的度量中。范例是对度量集之外的数据的引用。一个常见的用例是程序跟踪的 id。

Loki

Loki 是一个用于长期保留日志的后端存储。更多信息可以在 这里 找到。

Loki 实例在docker-compose.yml清单的loki部分有描述。

  loki:
    image: grafana/loki
    ports:
      - "3100:3100"

这个实例只是可用的latest loki 镜像,并在3100端口暴露其接口。

微服务应用程序通过其 REST API 将其日志直接发送到该环境中的 Loki 实例。

Tempo

Tempo 是一个用于长期保留 trace 的后端存储。更多信息可以在 这里 找到。

Tempo 实例在docker-compose.yml清单的tempo部分有描述。

Tempo 服务导入了一个配置文件(tempo/tempo.yaml),该文件用一些合理的默认值初始化服务,并允许接收各种不同格式的跟踪。

  tempo:
    image: grafana/tempo:1.2.1
    ports:
      - "3200:3200"
      - "4317:4317"
      - "55680:55680"
      - "55681:55681"
      - "14250:14250"
    command: [ "-config.file=/etc/tempo.yaml" ]
    volumes:
      - ./tempo/tempo.yaml:/etc/tempo.yaml
server:
  http_listen_port: 3200

distributor:
  receivers:                           # 此配置将监听 tempo 能够监听的所有端口和协议。
    jaeger:                            # 更多的配置信息可以从 OpenTelemetry 收集器中获得
      protocols:                       # 在这里:https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver
        thrift_http:                   #
        grpc:                          # 对于生产部署来说,你应该只启用你需要的接收器!
        thrift_binary:
        thrift_compact:
    otlp:
      protocols:
        http:
        grpc:

ingester:
  trace_idle_period: 10s               # 在一个追踪没有收到跨度后,认为它已经完成并将其冲走的时间长度。
  max_block_bytes: 1_000_000           # 当它达到这个尺寸时,切掉头块或。..
  max_block_duration: 5m               #   这么长时间

compactor:
  compaction:
    compaction_window: 1h              # 在这个时间窗口中的块将被压缩在一起
    max_block_bytes: 100_000_000       # 压实块的最大尺寸
    block_retention: 1h
    compacted_block_retention: 10m

storage:
  trace:
    backend: local                     # 使用的后端配置
    block:
      bloom_filter_false_positive: .05 # 较低的值会产生较大的过滤器,但会产生较少的假阳性结果。
      index_downsample_bytes: 1000     # 每条索引记录的字节数
      encoding: zstd                   # 块编码/压缩。 选项:none, gzip, lz4-64k, lz4-256k, lz4-1M, lz4, snappy, zstd
    wal:
      path: /tmp/tempo/wal             # 在本地存储 wal 的地方
      encoding: none                   # wal 编码/压缩。 选项:none, gzip, lz4-64k, lz4-256k, lz4-1M, lz4, snappy, zstd
    local:
      path: /tmp/tempo/blocks
    pool:
      max_workers: 100                 # worker 池决定了对对象存储后台的并行请求的数量
      queue_depth: 10000

search_enabled: true

Grafana Agent

Grafana Agent 是一个本地安装的代理,充当:

  • Prometheus 刮削服务。
  • Tempo 后端服务接收器 (backend service receiver) 和跟踪跨度处理器 (trace span processor)。
  • 一个 Promtail(Loki 日志接收器)实例。

Span metrics overview

Grafana Agent 具有远程写入功能,允许它将指标、日志和跟踪数据发送到后端存储(如 Mimir、Loki 和 Tempo)。关于 Grafana Agent 的更多信息可以在 这里 找到。

它在这个环境中的主要作用是接收来自微服务应用的跟踪跨度 (trace span),并处理它们以提取指标和日志信息,然后将它们存储到最终的后端存储。

它的配置文件可以在agent/config.yaml中找到。

  agent:
    image: grafana/agent:v0.24.0
    ports:
      - "12347:12345"
      - "12348:12348"
      - "6832:6832"
      - "55679:55679"
    volumes:
      - "${PWD}/agent/config.yaml:/etc/agent/agent.yaml"
    command: [
      "-config.file=/etc/agent/agent.yaml",
      "-server.http.address=0.0.0.0:12345",
    ]
server:
  log_level: debug

# 配置一个日志摄取端点,用于自动记录功能。
logs:
    configs:
    - name: loki
      clients:
        - url: http://loki:3100/loki/api/v1/push
          external_labels:
            job: agent
    positions_directory: /tmp/positions

# 配置一个 Tempo 实例来接收来自微服务的追踪。
traces:
  configs:
  - name: latencyEndpoint
    # 在 6832 端口接收 Jaeger 格式的追踪信息。
    receivers:
      jaeger:
        protocols:
          thrift_binary:
            endpoint: "0.0.0.0:6832"
    # 向 Tempo 实例发送成批的跟踪数据。
    remote_write:
      - endpoint: tempo:55680
        insecure: true
    # 从传入的跟踪跨度生成普罗米修斯指标。
    spanmetrics:
      # 添加 http.target 和 http.method span 标签作为度量数据的标签。
      dimensions:
        - name: http.method
        - name: http.target
      # 在 12348 端口暴露这些指标。
      handler_endpoint: 0.0.0.0:12348
    # 从传入的跟踪数据中自动生成日志。
    automatic_logging:
      # 使用在配置文件开始时定义的日志实例。
      backend: logs_instance
      logs_instance_name: loki
      # 每个根跨度记录一行(即每个跟踪记录一行)。
      roots: true
      processes: false
      spans: false
      # 在日志行中添加 http.method、http.target 和 http.status_code span 标签。如果有的话。
      span_attributes:
        - http.method
        - http.target
        - http.status_code
      # 强制将跟踪 ID 设置为`traceId`。
      overrides:
        trace_id_key: "traceId"
    # 启用服务图。
    service_graphs:
      enabled: true

词汇表

英文中文备注
Exemplars范例
Derived fields衍生字段
Metrics度量
Logging日志
Tracing跟踪
observability可观察性
span search跨度搜索Tempo 功能 - 需要 Grafana Agent
service graph服务图支持Tempo 功能 - 需要 Grafana Agent
scrape刮削Prometheus 词汇

Grafana 系列文章

Grafana 系列文章

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剑指 Offer 第9天 第10天

目录 剑指 Offer 42. 连续子数组的最大和 剑指 Offer 47. 礼物的最大价值 剑指 Offer 46. 把数字翻译成字符串 剑指 Offer 48. 最长不含重复字符的子字符串 剑指 Offer 42. 连续子数组的最大和 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所…

Python self用法详解

在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数。例如,定义一个 Person 类:class Person: def__init__(self): print("正在执行构造方法") #…

大数据项目---电商数仓(三)

目录 1.即席查询_Presto概述 2.即席查询_Presto_Server的部署 3.即席查询_Presto_Server启动 4.即席查询_命令行客户端说明 5.即席查询_LZO说明 6.即席查询_Presto_web端口 ​编辑 7.即席查询_Presto使用注意事项/优化 8.即席查询_Kylin简介 9.即席查询_前置概念 10.即…

数据库系统结构、数据库系统的组成

文章目录一、数据库系统的三级模式结构1.模式(逻辑模式)2.外模式(子模式、用户模式)3.内模式(存储模式)二、数据库的二级映像功能1.外模式/模式映像2.模式/内模式映像3.实际应用三、数据库系统的组成---硬件…

安卓性能优化之内存优化

Java对象生命周期: 创建:为对象分配内存空间,构造对象应用:此时 对象至少被一个强引用持有不可见:未被任何强引用持有,进行可达性分析不可达:可达性分析为不可达,进入下一阶段收集&…

notes

等差:,求 解:、 ,则 解: x系数y系数1412 由 得分母 ;则分子为, 解:令 已知两边及夹角,可图解 解析几何条件转化 1.平行四边形条件的转化几何性质代数实现(1)对边平行斜…

【IoT】创业:如何找到可以主导的创业市场?

如果你想开始创业,开启一段不一样的旅程,那么你首先要做的就是选赛道! 如何选择你的赛道、你的第一个市场呢? 换句话说就是,你如何选择自己的利基市场。 最大的市场,同时,它的需求范围也最广…

全国地级市1999—2020年污染物排放和环境治理相关指标(废水\废气\粉尘等)

工业废水、工业粉尘等污染物是影响居住环境的重要因素,也是在各项研究中常用的数据!之前我们基于历年的《中国城市统计年鉴》整理了1999—2020年的人口相关数据和用地相关数据(可查看之前推送的文章)。在《中国城市统计年鉴》中也…

欧拉回路(模板+外加一些优化)

给定一张图,请你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。 输入格式 第一行包含一个整数t, t∈ {1,2},如果t 1,表示所给图为无向图,如果t2,表示所给图为有向图。 第二行包含两个整数…

【MySQL】日志

https://www.cnblogs.com/myseries/p/10728533.html 在 MySQL 中,有多种不同的日志,包括错误日志、二进制日志、查询日志和慢查询日志,这些日志发挥着不同的作用。另外还有redo日志、undo日志和relay日志。 错误日志 错误日志是 MySQL 中最…

测试篇(四):测试用例的分类、按测试对象划分、按是否查看代码划分、你平时哪种测试方法用的多?、按照开发阶段划分

目录一、按测试对象划分1.1 界面测试1.2 可靠性测试1.3 容测性测试1.4 文档测试1.5 兼容性测试1.6 易用性测试1.7 安装卸载测试1.8 安全测试1.9 性能测试1.10 内存泄露测试1.11 弱网测试二、按是否查看代码划分2.1 黑盒测试2.2 白盒测试2.4 灰盒测试三、面试题:你平…

AcWing 327. 玉米田(状态压缩DP)

AcWing 327. 玉米田(状态压缩DP)一、问题二、分析1、思路2、状态表示3、状态转移4、循环设计5、初末状态三、代码一、问题 二、分析 1、思路 这道题与之前所讲解的AcWing 1064. 小国王(状态压缩DP)非常相似,所以如果…

ARM uboot 的源码目录分析

一、uboot的源码目录分析1 1、九鼎官方 uboot 和三星原版 uboot 对比 (1) 以九鼎官方的 uboot 为蓝本来学习的,以三星官方的这份为对照。 (2) 不同版本的 uboot 或者同一版本不同人移植的 uboot,可能目录结构和文件内容都有所不同。将来大家懂了后也可…

剑指 Offer 第8天

目录 剑指 Offer 10- I. 斐波那契数列 剑指 Offer 10- II. 青蛙跳台阶问题 剑指 Offer 63. 股票的最大利润 剑指 Offer 10- I. 斐波那契数列 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N)&#xf…

java并发编程面试题目及答案2(持续更新)

22、利用原子类手写 CAS 无锁 /** * 利用 cas 手写 锁 */ public class AtomicTryLock {private AtomicLong atomicLongnew AtomicLong(0);private Thread lockCurrentThread; /** * 1 表示锁已经被获取 0 表示锁没有获取 利用 cas 将 0 改为 1 成功则表示获取锁 * return */…

Linux find 命令

Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。语法find path -option [ -pr…

微服务-高并发-思路

一、为什么选择Go语言 Go 语言相对其它语言具有几点天然的优势: 语法简单,上手快性能高,编译快,开发效率也不低原生支持并发,协程模型是非常优秀的服务端模型,同时也适合网络调用部署方便,编译…

C语言深度解剖-关键字(3)

目录 1.关键字 sizeof C语言基本数据类型 认识 sizeof sizeof 相关扩展: 2. signed 与 unsigned 关键字 整形在内存的存储 如何快速转换二进制 写在最后: 1.关键字 sizeof C语言基本数据类型 以下是C语言基本的数据类型: 定义变量的…

Leetcode:37. 解数独(C++)

目录 问题描述: 实现代码与解析: 回溯: 原理思路: 问题描述: 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列…

分布式链路追踪SkyWalking进阶实战之RPC上报和WebHook通知(三)

目录 1.自定义SkyWalking链路追踪配置 1.1 什么是TraceId 1.2 使用的背景 1.3 编码 2.SkyWalking-RocketBot性能剖析 3.SkyWalking链路追踪-日志和RPC上报实战 4.源码部署 Apache SkyWalking 5.SkyWalking链路追踪-告警模块和WebHook通知《上》 6.SkyWalking链路追踪-…