Pprof是Go語言提供的效能分析工具之一,用於分析和最佳化Go程式的效能。您可通過Simple Log Service全棧可觀測中的Kubernetes Golang拉取功能,為Kubernetes中所有基於Go語言啟動並執行服務提供靈活且一站式的效能指標採集方案。
可觀測針對Golang語言提供了商業化版本的自研探針,提供了無侵入的埋點能力,擁有更加豐富的功能和更高的穩定性。詳細資料,請參見開始監控 Go 應用。
前提條件
採集原理
在Kubernetes中,Go程式效能指標採集組件的部署模型與日誌採集組件的部署模型相同,都為Daemonset。依託於日誌採集組件多維度Kubernetes資源選擇能力,採集Go程式的效能指標資料時,也支援通過環境變數、Kubernetes Labels、Namespace、Pod名稱、容器名稱過濾資料。另外,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拉取。
首次建立目標監控項的接入配置時,開啟建立開關,可進入配置頁面。如果您已建立過接入配置,則單擊
表徵圖,可進入配置頁面。單擊使用現有機器組。
安裝監控組件後,Simple Log Service自動建立名為
{instanceID}-{clusterID}-k8s-nodes的機器組,您可以直接使用該機器組。選中目標機器組(
{instanceID}-{clusterID}-k8s-nodes),將該機器組從源機器組移動到應用機器組,單擊下一步。重要如果機器組心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。
在資料來源設定設定精靈中,配置如下參數,然後單擊完成。
參數
說明
一般配置
配置名稱
設定Logtail採集配置的名稱。
叢集
設定Kubernetes叢集的名稱。
設定該參數後,Simple Log Service會為通過該Logtail採集配置採集到的Kubernetes Go Pprof效能資料添加cluster=叢集名稱的標籤。
重要請確保該叢集名稱唯一,否則可能出現資料衝突。
Profile白名單
選擇要採集的效能資料類別。
採集間隔
設定採集資料間隔時間,單位:秒。
逾時時間
設定採集資料逾時時間,單位:秒。
最大Body大小
設定採集資料的最大採集Body大小,單位:KB。
K8s選取器配置
Namespace
輸入匹配Namespace名稱的Regex,用於指定待採集的命名空間。
Pod名稱
輸入匹配Pod名稱的Regex,用於指定待採集的Pod。
容器名稱
輸入匹配容器名稱的Regex,用於指定待採集的容器。
環境變數白名單
環境變數白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的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滿足任一黑名單對即可被排除。
設定完成後,Simple Log Service將自動產生Metricstore等資產。更多資訊,請參見資產說明。