37.1 prometheus管理接口源码讲解

devtools/2024/12/28 16:16:23/

本节重点介绍 :

  • 生命周期控制相关
    • reload 热更新配置
  • pprof相关
  • 存储操作相关

生命周期控制相关

	if o.EnableLifecycle {router.Post("/-/quit", h.quit)router.Put("/-/quit", h.quit)router.Post("/-/reload", h.reload)router.Put("/-/reload", h.reload)} else {forbiddenAPINotEnabled := func(w http.ResponseWriter, _ *http.Request) {w.WriteHeader(http.StatusForbidden)w.Write([]byte("Lifecycle API is not enabled."))}router.Post("/-/quit", forbiddenAPINotEnabled)router.Put("/-/quit", forbiddenAPINotEnabled)router.Post("/-/reload", forbiddenAPINotEnabled)router.Put("/-/reload", forbiddenAPINotEnabled)}
  • reload的源码在3.7已经讲解过了
  • quit代表退出
  • 如果 --web.enable-lifecycle没开启的话访问会报错
Lifecycle API is not enabled.

pprof相关

func serveDebug(w http.ResponseWriter, req *http.Request) {ctx := req.Context()subpath := route.Param(ctx, "subpath")if subpath == "/pprof" {http.Redirect(w, req, req.URL.Path+"/", http.StatusMovedPermanently)return}if !strings.HasPrefix(subpath, "/pprof/") {http.NotFound(w, req)return}subpath = strings.TrimPrefix(subpath, "/pprof/")switch subpath {case "cmdline":pprof.Cmdline(w, req)case "profile":pprof.Profile(w, req)case "symbol":pprof.Symbol(w, req)case "trace":pprof.Trace(w, req)default:req.URL.Path = "/debug/pprof/" + subpathpprof.Index(w, req)}
}

pprof实例

  • 访问地址 /debug/pprof/

Types of profiles available:
Count	Profile
2255	allocs
0	block
0	cmdline
66	goroutine
2255	heap
0	mutex
0	profile
16	threadcreate
0	trace
full goroutine stack dump
Profile Descriptions:allocs: A sampling of all past memory allocations
block: Stack traces that led to blocking on synchronization primitives
cmdline: The command line invocation of the current program
goroutine: Stack traces of all current goroutines
heap: A sampling of memory allocations of live objects. You can specify the gc GET parameter to run GC before taking the heap sample.
mutex: Stack traces of holders of contended mutexes
profile: CPU profile. You can specify the duration in the seconds GET parameter. After you get the profile file, use the go tool pprof command to investigate the profile.
threadcreate: Stack traces that led to the creation of new OS threads
trace: A trace of execution of the current program. You can specify the duration in the seconds GET parameter. After you get the trace file, use the go tool trace command to investigate the trace.

pprof作用

  • pprof 是 Go 语言中分析程序运行性能的工具,它能提供各种性能数据:

在这里插入图片描述

主要体现下面4种实用功能

  1. CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置
  2. Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
  3. Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置
  4. Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况

prometheus_pprof__119">prometheus pprof 查看火焰图

安装作图库

  • yum -y install graphviz

直接生成svg文件

go tool pprof -svg  http://localhost:9090/debug/pprof/heap > b.svg

http直接查看

go tool pprof --http=0.0.0.0:7777 http://localhost:9090/debug/pprof/heap
Fetching profile over HTTP from http://localhost:10000/debug/pprof/profile?seconds=30
Saved profile in /root/pprof/pprof.a.samples.cpu.002.pb.gz
Serving web UI on http://0.0.0.0:7777
http://0.0.0.0:7777

火焰图样例
在这里插入图片描述

>

>

存储操作相关

	// Admin APIsr.Post("/admin/tsdb/delete_series", wrap(api.deleteSeries))r.Post("/admin/tsdb/clean_tombstones", wrap(api.cleanTombstones))r.Post("/admin/tsdb/snapshot", wrap(api.snapshot))r.Put("/admin/tsdb/delete_series", wrap(api.deleteSeries))r.Put("/admin/tsdb/clean_tombstones", wrap(api.cleanTombstones))r.Put("/admin/tsdb/snapshot", wrap(api.snapshot))
  • 这些操作需要 web.enable-admin-api=true
	a.Flag("web.enable-admin-api", "Enable API endpoints for admin control actions.").Default("false").BoolVar(&cfg.web.EnableAdminAPI)

删除series(不常用)

  • 调用api.db.Delete删除数据
  • 数据的删除不应该手动触发,应该让tsdb 做过期删除
func (api *API) deleteSeries(r *http.Request) apiFuncResult {if !api.enableAdmin {return apiFuncResult{nil, &apiError{errorUnavailable, errors.New("admin APIs disabled")}, nil, nil}}if err := r.ParseForm(); err != nil {return apiFuncResult{nil, &apiError{errorBadData, errors.Wrap(err, "error parsing form values")}, nil, nil}}if len(r.Form["match[]"]) == 0 {return apiFuncResult{nil, &apiError{errorBadData, errors.New("no match[] parameter provided")}, nil, nil}}start, err := parseTimeParam(r, "start", minTime)if err != nil {return invalidParamError(err, "start")}end, err := parseTimeParam(r, "end", maxTime)if err != nil {return invalidParamError(err, "end")}for _, s := range r.Form["match[]"] {matchers, err := parser.ParseMetricSelector(s)if err != nil {return invalidParamError(err, "match[]")}if err := api.db.Delete(timestamp.FromTime(start), timestamp.FromTime(end), matchers...); err != nil {return apiFuncResult{nil, &apiError{errorInternal, err}, nil, nil}}}return apiFuncResult{nil, nil, nil, nil}
}

本节重点总结 :

  • 生命周期控制相关
    • reload 热更新配置
  • pprof相关
  • 存储操作相关

http://www.ppmy.cn/devtools/145759.html

相关文章

Java基于SSM框架的无中介租房系统小程序【附源码、文档】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

spring专题笔记(六):bean的自动装配(自动化注入)-根据名字进行自动装配、根据类型进行自动装配。代码演示,通俗易懂。

目录 一、根据名字进行自动装配--byName 二、根据类型进行自动装配 byType 本文章主要是介绍spring的自动装配机制, 用代码演示spring如何根据名字进行自动装配、如何根据类型进行自动装配。代码演示,通俗易懂。 一、根据名字进行自动装配--byName Us…

v8引擎垃圾回收

V8引擎垃圾回收机制 v8引擎负责JavaScript的执行。V8引擎具有内置的垃圾回收机制,用于自动管理内存分配和释放 堆与栈 栈空间 栈空间是小而连续的内存空间,主要用于存储局部变量和函数调用的相关信息,同时栈结构是“先进后出”的策略 栈…

数据仓库工具箱—读书笔记02(Kimball维度建模技术概述03、维度表技术基础)

Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同…

typescript数据类型(二)

四、高级数据类型 1. 接口(interface) (1) 接口定义变量和函数参数的类型 //定义接口,给对象使用 interface InfoItf{name:string,age:number,height:string }let obj:InfoItf {name: Lucy,age: 14,height: 175 }/…

Redis 应用场景深度探索

一、Redis 简介 Redis(Remote Dictionary Server)是一款高性能的开源内存数据库,同时也可用作缓存系统。它以其卓越的性能和丰富的数据结构而备受瞩目,具有以下关键特性: 基于内存存储:数据读写操作主要在…

Redis篇--常见问题篇9--其他一些问题

之前的篇章中介绍了Redis使用中的一些问题,如:缓存穿透,缓存雪崩,缓存击穿,缓存一致性,大Key以及热Key,这些问题算是比较常遇到的问题了。除此之外,还有一些其他的问题,如…

<代码随想录> 算法训练营-2024.12.26

今日专题 :动态规划 子序列 1143. 最长公共子序列 描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串&#xff1…