接入Kubernetes Go程序性能数据

Pprof是Go语言提供的性能分析工具之一,用于分析和优化Go程序的性能。您可通过日志服务全栈可观测中的Kubernetes Golang拉取功能,为Kubernetes中所有基于Go语言运行的服务提供灵活且一站式的性能指标采集方案。

前提条件

  • 已创建全栈可观测实例。具体操作,请参见创建实例

  • 已安装监控组件。具体操作,请参见安装监控组件

    说明

    需要通过Kubernetes组件安装特殊版Logtail镜像,Logtail镜像Tag需为v1.7.1.0-monitor-aliyun及以上版本。

采集原理

在Kubernetes中,Go程序性能指标采集组件的部署模型与日志采集组件的部署模型相同,都为Daemonset。依托于日志采集组件多维度Kubernetes资源选择能力,采集Go程序的性能指标数据时,也支持通过环境变量、Kubernetes Labels、Namespace、Pod名称、容器名称过滤数据。更多信息,请参见日志采集组件多维度Kubernetes资源选择能力另外,Go程序的性能指标涉及Go进程之间的通信,Kubernetes资源选择可能命中大量非相关进程,因此Logtail增加了一个特殊的环境变量ILOGTAIL_PROFILE_PORT,用于进一步精确指定采集目标。

Go语言已内置Pprof性能数据暴露机制。在Go程序中启动内置的Pprof性能数据暴露机制后,Logtail会通过HTTP接口获取Pprof数据。

image.png

准备工作

  1. 开启性能数据暴露。

    在接入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)
    }
  2. 配置环境变量ILOGTAIL_PROFILE_PORT。

    其中,环境变量ILOGTAIL_PROFILE_PORT的值为具体暴露的端口,例如ILOGTAIL_PROFILE_PORT=8080。

创建Logtail采集配置

  1. 登录日志服务控制台

  2. 日志应用区域的智能运维页签下,单击全栈可观测

  3. SLS全栈可观测页面,单击目标实例。

  4. 在左侧导航栏中,单击性能监控

    首次在该实例中使用性能监控时,请单击立即开启

  5. 在左侧导航栏中,单击数据接入,然后在数据接入配置页面,找到Kubernetes Golang拉取

    首次创建目标监控项的接入配置时,打开创建开关,可进入配置页面。如果您已创建过接入配置,则单击创建图标,可进入配置页面。

  6. 单击使用现有机器组

    安装监控组件后,日志服务自动创建名为{instanceID}-{clusterID}-k8s-nodes的机器组,您可以直接使用该机器组。

  7. 选中目标机器组({instanceID}-{clusterID}-k8s-nodes),将该机器组从源机器组移动到应用机器组,单击下一步

    重要

    如果机器组心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。

  8. 数据源设置配置向导中,配置如下参数,然后单击完成

    参数

    说明

    一般配置

    配置名称

    设置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和环境变量的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配,例如:设置keyNGINX_SERVICE_PORT,设置value^(80|6379)$,表示可匹配服务端口为80、6379的容器。

    多个白名单之间为或关系,即只要容器的环境变量满足任一键值对即可被匹配。

    环境变量黑名单

    环境变量黑名单,用于排除不采集的容器。默认为空,表示不排除任何容器。如果您要设置环境变量黑名单,那么key必填,value可选填。

    • 如果value为空,则容器环境变量中包含key的容器的日志都将被排除。

    • 如果value不为空,则容器环境变量中包含key=value的容器才会被排除。

      value默认为字符串匹配,即只有value和环境变量的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配,例如:设置keyNGINX_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的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配。例如设置keyapp,设置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的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配。例如设置keyapp,设置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的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配。例如:配置keyio.kubernetes.container.name,配置value^(nginx|cube)$,表示可匹配名为nginx、cube的容器。

    多个白名单之间为或关系,即只要容器Label满足任一白名单即可被匹配。

    容器Label黑名单

    容器Label黑名单,用于排除不采集的容器。默认为空,表示不排除任何容器。如果您要设置容器Label黑名单,那么key必填,value可选填。

    • 如果value为空,则容器Label中包含key的容器都将被排除。

    • 如果value不为空,则容器Label中包含key=value的容器才会被排除。

      value默认为字符串匹配,即只有value和容器Label的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配。例如:设置keyio.kubernetes.container.name,设置value^(nginx|cube)$,表示可匹配名为nginx、cube的容器。

    多个黑名单之间为或关系,即只要容器Label满足任一黑名单对即可被排除。

    设置完成后,日志服务将自动生成Metricstore等资产。更多信息,请参见资产说明

后续步骤

接入Go Pprof性能数据后,您可以通过性能监控探索功能进行性能问题排查。具体操作,请参见数据查询数据对比