<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Observability on 断念梦的站点</title><link>https://desistdaydream.github.io/tags/Observability/</link><description>Recent content in Observability on 断念梦的站点</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://desistdaydream.github.io/tags/Observability/index.xml" rel="self" type="application/rss+xml"/><item><title>Thanos</title><link>https://desistdaydream.github.io/docs/6.%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7/Metrics/Prometheus/Prometheus-%E8%A1%8D%E7%94%9F%E5%93%81/Thanos/Thanos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/6.%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7/Metrics/Prometheus/Prometheus-%E8%A1%8D%E7%94%9F%E5%93%81/Thanos/Thanos/</guid><description>&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/thanos-io/thanos"&gt;GitHub 项目，thanos-io/thanos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thanos.io/"&gt;官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qikqiak.com/k8strain/monitor/thanos/#thanos"&gt;K8S 训练营，Kubernetes 监控-Thanos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/VRnf0BMZfWSM4QobsHSiYg"&gt;公众号-k8s 技术圈，使用 Thanos 集中管理多 Prometheus 实例数据&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s/o3Gr8X5Br3DsOATvXXlZBw"&gt;公众号-k8s 技术圈，Thanos Ruler 组件的使用&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先需要明确一点，Thanos 是一组程序的统称。这一组程序可以组成具有无限存储容量的高可用 Metrics 系统。可以将其无缝添加到现有 Prometheus 之上。&lt;/p&gt;
&lt;p&gt;单独使用 Prometheus 可能产生的问题&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;长、短期数据未分层，一套 Prometheus 在被查询长周期指标时，Prometheus 所在服务器的内存、CPU 使用率飙升，甚至可能导致监控、告警服务不可用，原因在于两点：
&lt;ul&gt;
&lt;li&gt;查询长周期数据时，Prometheus 会将大量数据载入内存&lt;/li&gt;
&lt;li&gt;Prometheus 载入的不是降采样数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;查询的时间范围越大，需要的内存就越多。在另一个生产的方案中，采用 VictoriaMetrics 单机版作为远端存储，服务器内存高达 128G。同时，这种方式还存在丢数据的情况。&lt;/li&gt;
&lt;li&gt;Prometheus 联邦的方式，只是结局了将多个 Prometheus 聚合起来的情况，并没有提供抽样的能力，不能加快长周期指标的查询，不适用于当前远端存储的场景。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;综上所属&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thanos Compact 组件能对指标数据进行降采样，以提高大时间范围查询的效率&lt;/li&gt;
&lt;li&gt;Thanos 的 Sidecar 和 Receiver 组件都可以将指标数据转存到对象存储中&lt;/li&gt;
&lt;li&gt;Thanos Querier 组件可以&lt;/li&gt;
&lt;li&gt;此时，通过 Thanos 将数据分了层
&lt;ul&gt;
&lt;li&gt;短期数据保存在 Receiver 或 Prometheus 中，用于告警系统的高频查询以及 Grafana 的展示&lt;/li&gt;
&lt;li&gt;长期数据保存在对象存储中，以供后续分析使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="thanos-架构概述"&gt;Thanos 架构概述&lt;a class="td-heading-self-link" href="#thanos-%e6%9e%b6%e6%9e%84%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thanos 遵循 &lt;a href="https://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt; 和 Unix 哲学，由一组组件组成，每个组件都可以实现特定的功能：&lt;/p&gt;</description></item><item><title>SNMP(传统监控标准)</title><link>https://desistdaydream.github.io/docs/6.%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7/Metrics/%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0/SNMP%E4%BC%A0%E7%BB%9F%E7%9B%91%E6%8E%A7%E6%A0%87%E5%87%86/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/6.%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7/Metrics/%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0/SNMP%E4%BC%A0%E7%BB%9F%E7%9B%91%E6%8E%A7%E6%A0%87%E5%87%86/</guid><description>&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc1157"&gt;RFC 1157，A Simple Network Management Protocol (SNMP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc1156"&gt;RFC 1156，Management Information Base for Network Management of TCP/IP-based internets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol"&gt;Wiki, SNMP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Simple Network Management Protocol(简单网络管理协议，简称 SNMP)&lt;/strong&gt;。想实现该协议，通常需要由两部分完成(监控端和被监控端)，是在两端的两个进程之间进行通信，该进程都需要占用一个 socket&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;监控端：通常称为 NMS 端，管理端&lt;/li&gt;
&lt;li&gt;被监控端：通常称为 Agent 端，NMS 要去收集被监控端的数据的时候，可能收集到的是一些很敏感的数据(CPU 使用率，带宽占用率等，这些一般是不公开的)，所以需要在被监控节点上部署一个专门的程序，这个程序能在本地取得一定的管理权限，然后接受监控端发送的数据收集指令，代为在被监控节点本地完成数据收集，所以被称为 Agent 端，代理端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SNMP 的工作模式，使用 udp 协议发送报文&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;监控端主动发送请求到被监控端的 agent 去收集数据&lt;/li&gt;
&lt;li&gt;被监控节点主动向监控端报告自己所采集的数据&lt;/li&gt;
&lt;li&gt;当监控端发现被监控端发生异常时，可以发送一些控制指令，将被监控端修改一些参数&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="实现-snmp-的组件"&gt;实现 SNMP 的组件&lt;a class="td-heading-self-link" href="#%e5%ae%9e%e7%8e%b0-snmp-%e7%9a%84%e7%bb%84%e4%bb%b6" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Management Information Base(管理信息库，简称 MIB)&lt;/strong&gt; # 用来定义所有监控端的 objects，其中包括 objects 的名称、OID、数据类型、描述(干什么用的)。MIB 也可以看作是 SNMP 的服务端与代理端的沟通桥梁，只有具有统一的格式，才能确定数据。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Object(对象)&lt;/strong&gt; # 这个对象可以是一个具体需要采集到的数据，比如 内存、CPU、磁盘、网络接口等等，也可以是一种抽象的集合，比如地区、硬件、系统、硬件、网络等等。上面说的所有事物，每一个都是一个 Object。所以，Object 可以包含另一个 Object，这也是人称常常将 MIB 称为&lt;strong&gt;树状&lt;/strong&gt;的原因
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Object Identifier(对象标识符，简称 OID)&lt;/strong&gt; # 每一个 Object 都有一个 OID&lt;/li&gt;
&lt;li&gt;数据存取格式：即每个 object 除了 OID 用作标示以外，还有数据内容需要遵循一定个格式规范&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structure of Managerment Intormation(管理信息结构,简称 SMI)&lt;/strong&gt; # 是 &lt;a href="https://desistdaydream.github.io/docs/2.%E7%BC%96%E7%A8%8B/%E6%97%A0%E6%B3%95%E5%88%86%E7%B1%BB%E7%9A%84%E8%AF%AD%E8%A8%80/ASN.1/"&gt;ASN.1&lt;/a&gt; 的子集&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SNMP 本身&lt;/strong&gt; # 一般通过 Net-SNMP 中的工具实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所谓的 &lt;strong&gt;MIB&lt;/strong&gt;，其实主要是通过文件记录的内容。与其说是用文件记录，不如说 MIB 就是使用 ASN.1(标准的接口描述语言) 编写的代码。ASN.1 语言同样有类似 import、 function 这类的东西。只不过，记录 MIB 文件的语言，又与 ASN.1 有一些细微的区别，我们暂且称为 &lt;strong&gt;MIB 语言&lt;/strong&gt; 吧~&lt;/p&gt;</description></item><item><title>观测容器</title><link>https://desistdaydream.github.io/docs/10.%E4%BA%91%E5%8E%9F%E7%94%9F/Containerization-implementation/%E5%AE%B9%E5%99%A8%E7%AE%A1%E7%90%86/%E8%A7%82%E6%B5%8B%E5%AE%B9%E5%99%A8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://desistdaydream.github.io/docs/10.%E4%BA%91%E5%8E%9F%E7%94%9F/Containerization-implementation/%E5%AE%B9%E5%99%A8%E7%AE%A1%E7%90%86/%E8%A7%82%E6%B5%8B%E5%AE%B9%E5%99%A8/</guid><description>&lt;h1 id="概述"&gt;概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;容器的 &lt;a href="https://desistdaydream.github.io/docs/6.%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7/Observability/Observability/"&gt;Observability&lt;/a&gt; 如何实现？&lt;/p&gt;
&lt;p&gt;Docker 为什么不内置 cAdvisor？docker stats 命令为什么不设计个接口直接吐出来 OpenMetrics 格式的数据？&lt;/p&gt;
&lt;h1 id="cadvisor"&gt;cAdvisor&lt;a class="td-heading-self-link" href="#cadvisor" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/cadvisor"&gt;GitHub 项目，google/cadvisor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/guides/cadvisor/"&gt;Prometheus 官方文档，指南 - 使用 cAdvisor 监控 Docker 容器指标&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.xuyasong.com/?p=1483"&gt;http://www.xuyasong.com/?p=1483&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Container Advisor(容器顾问，简称 cAdvisor)&lt;/strong&gt; 为容器用户提供了对其运行中容器的资源使用情况和性能特征的深入理解。它是一个持续运行的守护进程，负责收集、汇总、处理并导出有关运行容器的信息。具体而言，它会记录每个容器的资源隔离参数、历史资源使用情况、完整历史资源使用直方图以及网络统计信息。这些数据会按容器和整机维度分别导出。&lt;/p&gt;
&lt;p&gt;cAdvisor 被集成在 &lt;a href="https://desistdaydream.github.io/docs/10.%E4%BA%91%E5%8E%9F%E7%94%9F/Kubernetes/Kubelet/Kubelet/"&gt;Kubelet&lt;/a&gt; 中&lt;/p&gt;
&lt;h2 id="暴露的指标"&gt;暴露的指标&lt;a class="td-heading-self-link" href="#%e6%9a%b4%e9%9c%b2%e7%9a%84%e6%8c%87%e6%a0%87" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;cadvisor_version_info 具有常数“1”值的度量，由内核版本、操作系统版本、docker 版本、cadvisor 版本和 cadvisor 修订版标记。&lt;/li&gt;
&lt;li&gt;container_cpu_cfs_periods_total 已用强制周期间隔数。&lt;/li&gt;
&lt;li&gt;container_cpu_cfs_throttled_periods_total 节流周期间隔数。&lt;/li&gt;
&lt;li&gt;container_cpu_cfs_throttled_seconds_total 容器被限制的总持续时间。&lt;/li&gt;
&lt;li&gt;container_cpu_load_average_10s 过去 10 秒内容器 cpu 负载平均值的值。&lt;/li&gt;
&lt;li&gt;container_cpu_system_seconds_total 以秒为单位消耗的累积系统 CPU 时间。&lt;/li&gt;
&lt;li&gt;container_cpu_usage_seconds_total 以秒为单位消耗的累积 CPU 时间。&lt;/li&gt;
&lt;li&gt;container_cpu_user_seconds_total 以秒为单位消耗的累积用户 cpu 时间。&lt;/li&gt;
&lt;li&gt;container_file_descriptors 容器的打开文件描述符数。&lt;/li&gt;
&lt;li&gt;container_fs_inodes_free 可用索引节点数&lt;/li&gt;
&lt;li&gt;container_fs_inodes_total inode 数&lt;/li&gt;
&lt;li&gt;container_fs_io_current 当前正在进行的 I/O 数&lt;/li&gt;
&lt;li&gt;container_fs_io_time_seconds_total 花费在 I/O 上的累计秒数&lt;/li&gt;
&lt;li&gt;container_fs_io_time_weighted_seconds_total 累积加权 I/O 时间（以秒为单位）&lt;/li&gt;
&lt;li&gt;container_fs_limit_bytes 此文件系统上的容器可以消耗的字节数。&lt;/li&gt;
&lt;li&gt;container_fs_read_seconds_total 阅读花费的累计秒数&lt;/li&gt;
&lt;li&gt;container_fs_reads_bytes_total 读取的累积字节数&lt;/li&gt;
&lt;li&gt;container_fs_reads_merged_total 合并读取的累积计数&lt;/li&gt;
&lt;li&gt;container_fs_reads_total 已完成读取的累计计数&lt;/li&gt;
&lt;li&gt;container_fs_sector_reads_total 已完成扇区读取的累积计数&lt;/li&gt;
&lt;li&gt;container_fs_sector_writes_total 已完成扇区写入的累积计数&lt;/li&gt;
&lt;li&gt;container_fs_usage_bytes 此文件系统上的容器消耗的字节数。&lt;/li&gt;
&lt;li&gt;container_fs_write_seconds_total 写入花费的累计秒数&lt;/li&gt;
&lt;li&gt;container_fs_writes_bytes_total 写入字节的累积计数&lt;/li&gt;
&lt;li&gt;container_fs_writes_merged_total 合并写入的累积计数&lt;/li&gt;
&lt;li&gt;container_fs_writes_total 已完成写入的累积计数&lt;/li&gt;
&lt;li&gt;container_last_seen 上次导出器看到容器的时间&lt;/li&gt;
&lt;li&gt;container_memory_cache 页缓存内存的字节数。&lt;/li&gt;
&lt;li&gt;container_memory_failcnt 内存使用次数达到限制&lt;/li&gt;
&lt;li&gt;container_memory_failures_total 内存分配失败的累积计数。&lt;/li&gt;
&lt;li&gt;container_memory_mapped_file 内存映射文件的大小（以字节为单位）。&lt;/li&gt;
&lt;li&gt;container_memory_max_usage_bytes 以字节为单位记录的最大内存使用量&lt;/li&gt;
&lt;li&gt;container_memory_rss RSS 的大小（以字节为单位）。&lt;/li&gt;
&lt;li&gt;container_memory_swap 容器交换使用量（以字节为单位）。&lt;/li&gt;
&lt;li&gt;container_memory_usage_bytes 当前内存使用量（以字节为单位），包括所有内存，无论何时访问&lt;/li&gt;
&lt;li&gt;container_memory_working_set_bytes 当前工作集（以字节为单位）。&lt;/li&gt;
&lt;li&gt;container_network_receive_bytes_total 接收字节的累计计数&lt;/li&gt;
&lt;li&gt;container_network_receive_errors_total 接收时遇到的错误累积计数&lt;/li&gt;
&lt;li&gt;container_network_receive_packets_dropped_total 接收时丢弃的数据包的累积计数&lt;/li&gt;
&lt;li&gt;container_network_receive_packets_total 接收的数据包的累积计数&lt;/li&gt;
&lt;li&gt;container_network_transmit_bytes_total 传输的累积字节数&lt;/li&gt;
&lt;li&gt;container_network_transmit_errors_total 传输时遇到的错误累积计数&lt;/li&gt;
&lt;li&gt;container_network_transmit_packets_dropped_total 传输时丢弃的数据包的累积计数&lt;/li&gt;
&lt;li&gt;container_network_transmit_packets_total 传输的数据包的累积计数&lt;/li&gt;
&lt;li&gt;container_processes 在容器内运行的进程数。&lt;/li&gt;
&lt;li&gt;container_scrape_error 1 如果在获取容器指标时出错，则为 0 否则&lt;/li&gt;
&lt;li&gt;container_sockets 容器打开的套接字数。&lt;/li&gt;
&lt;li&gt;container_spec_cpu_period 容器的 CPU 周期。&lt;/li&gt;
&lt;li&gt;container_spec_cpu_quota 容器的 CPU 配额。&lt;/li&gt;
&lt;li&gt;container_spec_cpu_shares 容器的 CPU 份额。&lt;/li&gt;
&lt;li&gt;container_spec_memory_limit_bytes 容器的内存限制。&lt;/li&gt;
&lt;li&gt;container_spec_memory_reservation_limit_bytes 容器的内存预留限制。&lt;/li&gt;
&lt;li&gt;container_spec_memory_swap_limit_bytes 容器的内存交换限制。&lt;/li&gt;
&lt;li&gt;container_start_time_seconds 自 Unix 纪元以来容器的启动时间（以秒为单位）。&lt;/li&gt;
&lt;li&gt;container_tasks_state 处于给定状态的任务数&lt;/li&gt;
&lt;li&gt;container_threads 容器内运行的线程数&lt;/li&gt;
&lt;li&gt;container_threads_max 容器内允许的最大线程数，如果值为零则无穷大&lt;/li&gt;
&lt;li&gt;container_ulimits_soft 容器根进程的软 ulimit 值。如果 -1 则无限制，优先级和好除外&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="grafana-面板"&gt;Grafana 面板&lt;a class="td-heading-self-link" href="#grafana-%e9%9d%a2%e6%9d%bf" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/grafana/dashboards/21361-docker-cadvisor-compute-resources/"&gt;https://grafana.com/grafana/dashboards/21361-docker-cadvisor-compute-resources/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/grafana/dashboards/19792-cadvisor-dashboard/"&gt;https://grafana.com/grafana/dashboards/19792-cadvisor-dashboard/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>