Pprof是Go语言提供的性能分析工具之一,用于分析和优化Go程序的性能。您可通过日志服务全栈可观测中的Kubernetes Golang拉取功能,为Kubernetes中所有基于Go语言运行的服务提供灵活且一站式的性能指标采集方案。
前提条件
采集原理
在Kubernetes中,Go程序性能指标采集组件的部署模型与日志采集组件的部署模型相同,都为Daemonset。依托于日志采集组件多维度Kubernetes资源选择能力,采集Go程序的性能指标数据时,也支持通过环境变量、Kubernetes Labels、Namespace、Pod名称、容器名称过滤数据。更多信息,请参见日志采集组件多维度Kubernetes资源选择能力。另外,Go程序的性能指标涉及Go进程之间的通信,Kubernetes资源选择可能命中大量非相关进程,因此Logtail增加了一个特殊的环境变量ILOGTAIL_PROFILE_PORT,用于进一步精确指定采集目标。
Go语言已内置Pprof性能数据暴露机制。在Go程序中启动内置的Pprof性能数据暴露机制后,Logtail会通过HTTP接口获取Pprof数据。
准备工作
开启性能数据暴露。
在接入Go Pprof性能数据前,您需要先启动Go程序性能数据的暴露机制。您可以通过如下方式启动内置的暴露机制,也可以自定义暴露机制,但需保证Pprof数据暴露于
{host}:{port}/debug/pprof/端口
。下述示例表示将Pprof性能数据暴露于8080端口。package main import ( "net/http" _ "net/http/pprof" ) func main() { // do something... _ = http.ListenAndServe(":8080", nil) }
配置环境变量ILOGTAIL_PROFILE_PORT。
其中,环境变量ILOGTAIL_PROFILE_PORT的值为具体暴露的端口,例如ILOGTAIL_PROFILE_PORT=8080。
创建Logtail采集配置
登录日志服务控制台。
在日志应用区域的智能运维页签下,单击全栈可观测。
在SLS全栈可观测页面,单击目标实例。
在左侧导航栏中,单击性能监控。
首次在该实例中使用性能监控时,请单击立即开启。
在左侧导航栏中,单击数据接入,然后在数据接入配置页面,找到Kubernetes Golang拉取。
首次创建目标监控项的接入配置时,打开创建开关,可进入配置页面。如果您已创建过接入配置,则单击图标,可进入配置页面。
单击使用现有机器组。
安装监控组件后,日志服务自动创建名为
{instanceID}-{clusterID}-k8s-nodes
的机器组,您可以直接使用该机器组。选中目标机器组(
{instanceID}-{clusterID}-k8s-nodes
),将该机器组从源机器组移动到应用机器组,单击下一步。重要如果机器组心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。
在数据源设置配置向导中,配置如下参数,然后单击完成。
参数
说明
一般配置
配置名称
设置Logtail采集配置的名称。
集群
设置Kubernetes集群的名称。
设置该参数后,日志服务会为通过该Logtail采集配置采集到的Kubernetes Go Pprof性能数据添加cluster=集群名称的标签。
重要请确保该集群名称唯一,否则可能出现数据冲突。
Profile白名单
选择要采集的性能数据类别。
采集间隔
设置采集数据间隔时间,单位:秒。
超时时间
设置采集数据超时时间,单位:秒。
最大Body大小
设置采集数据的最大采集Body大小,单位:KB。
K8s选择器配置
Namespace
输入匹配Namespace名称的正则表达式,用于指定待采集的命名空间。
Pod名称
输入匹配Pod名称的正则表达式,用于指定待采集的Pod。
容器名称
输入匹配容器名称的正则表达式,用于指定待采集的容器。
环境变量白名单
环境变量白名单,用于指定待采集的容器。默认为空,表示采集所有容器的Kubernetes Go程序性能数据。如果您要设置环境变量白名单,那么key必填,value可选填。
如果value为空,则容器环境变量中包含key的容器都匹配。
如果value不为空,则容器环境变量中包含key=value的容器才匹配。
value默认为字符串匹配,即只有value和环境变量的值完全相同才会匹配。如果该值以
^
开头并且以$
结尾,则为正则匹配,例如:设置key为NGINX_SERVICE_PORT,设置value为^(80|6379)$,表示可匹配服务端口为80、6379的容器。
多个白名单之间为或关系,即只要容器的环境变量满足任一键值对即可被匹配。
环境变量黑名单
环境变量黑名单,用于排除不采集的容器。默认为空,表示不排除任何容器。如果您要设置环境变量黑名单,那么key必填,value可选填。
如果value为空,则容器环境变量中包含key的容器的日志都将被排除。
如果value不为空,则容器环境变量中包含key=value的容器才会被排除。
value默认为字符串匹配,即只有value和环境变量的值完全相同才会匹配。如果该值以
^
开头并且以$
结尾,则为正则匹配,例如:设置key为NGINX_SERVICE_PORT,设置value为^(80|6379)$,表示可匹配服务端口为80、6379的容器。
多个黑名单之间为或关系,即只要容器的环境变量满足任一键值对即可被排除。
K8s Label白名单
通过Kubernetes Label白名单指定待采集的容器。如果您要设置Kubernetes Label白名单,那么key必填,value可选填。
如果value为空,则Kubernetes Label中包含key的容器都匹配。
value不为空,则Kubernetes Label中包含key=value的容器才匹配。
value默认为字符串匹配,即只有value和Kubernetes Label的值完全相同才会匹配。如果该值以
^
开头并且以$
结尾,则为正则匹配。例如设置key为app,设置value为^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。
多个白名单之间为或关系,即只要Kubernetes Label满足任一白名单即可被匹配。
K8s Label黑名单
通过Kubernetes Label黑名单排除不采集的容器。如果您要设置Kubernetes Label黑名单,那么key必填,value可选填。
如果value为空,则Kubernetes Label中包含key的容器都被排除。
如果value不为空,则Kubernetes Label中包含key=value的容器才会被排除。
value默认为字符串匹配,即只有value和Kubernetes Label的值完全相同才会匹配。如果该值以
^
开头并且以$
结尾,则为正则匹配。例如设置key为app,设置value为^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。
多个黑名单之间为或关系,即只要Kubernetes Label满足任一黑名单对即可被排除。
容器Label白名单
容器Label白名单,用于指定待采集的容器。默认为空,表示采集所有容器的Kubernetes Go程序性能数据。如果您要设置容器Label白名单,那么key必填,value可选填。
如果value为空,则容器Label中包含key的容器都匹配。
如果value不为空,则容器Label中包含key=value的容器才匹配。
value默认为字符串匹配,即只有value和容器Label的值完全相同才会匹配。如果该值以
^
开头并且以$
结尾,则为正则匹配。例如:配置key为io.kubernetes.container.name,配置value为^(nginx|cube)$,表示可匹配名为nginx、cube的容器。
多个白名单之间为或关系,即只要容器Label满足任一白名单即可被匹配。
容器Label黑名单
容器Label黑名单,用于排除不采集的容器。默认为空,表示不排除任何容器。如果您要设置容器Label黑名单,那么key必填,value可选填。
如果value为空,则容器Label中包含key的容器都将被排除。
如果value不为空,则容器Label中包含key=value的容器才会被排除。
value默认为字符串匹配,即只有value和容器Label的值完全相同才会匹配。如果该值以
^
开头并且以$
结尾,则为正则匹配。例如:设置key为io.kubernetes.container.name,设置value为^(nginx|cube)$,表示可匹配名为nginx、cube的容器。
多个黑名单之间为或关系,即只要容器Label满足任一黑名单对即可被排除。
设置完成后,日志服务将自动生成Metricstore等资产。更多信息,请参见资产说明。