Ansluter Go Profilering Med Spårning · Felix Geisendörfer

Ansluter Go Profilering Med Spårning · Felix Geisendörfer


Ansluter Go Profilering Med Spårning · Felix Geisendörfer

Publicerad:

Idag skulle jag vilja dela med mig av några tankar om några nya profileringsfunktioner som vi nyligen levererade hos Datadog. Jag ska förklara vad de gör, hur de fungerar och vilka Go 1.18-bidrag som behövdes för att saker och ting skulle fungera bra.

Feature Showcase

Låt oss börja med slutresultatet. Föreställ dig att du har ett spår på 100 ms där 10 ms spenderas på en databasfråga, men 90 ms förblir oförklarade.

När detta händer behöver du vanligtvis studera din kod för ledtrådar. Har du glömt några spårningsinstrument? Dags att lägga till det, distribuera om och vänta. Eller kanske du behöver optimera din Go-kod? Om ja, hur?

Detta arbetsflöde är hanterbart, men det visar sig att det finns ett bättre sätt – vi kan använda profileringsdata för att fylla i luckorna. Och det är precis vad vår nya Code Hotspots-funktion gör. Som du kan se nedan använde vår begäran 90ms On-CPU-tid. Detta är en stark signal som låter oss utesluta off-CPU-aktivitet som oinstrumenterade servicesamtal, mutex-konflikter, kanalväntningar, sovande etc.

Ännu bättre, när vi klickar på knappen “Visa profil”, kan vi se denna On-CPU-tid som ett flamdiagram per begäran. Här kan vi se att vår tid ägnades åt JSON-kodning.

Och eftersom våra HTTP-hanterarfunktioner inte visas i stackspåren, kan vi också indirekt dra slutsatsen att detta arbete gjordes i en bakgrundsgoroutin som skapades av den goroutine som hanterade begäran.

Förutom att bryta ned spårningsinformation med hjälp av profilering kan vi också göra tvärtom och bryta ner en profils CPU-tid efter slutpunkt som visas nedan. Kryssrutorna kan användas för att filtrera profilen efter slutpunkt.

Och för att göra det lättare att förstå förändringar över tid, t.ex. efter en implementering, kan vi rita upp dessa data.

Hur det fungerar

Funktionerna är byggda ovanpå en befintlig Go-funktion som kallas pprof-etiketter som gör att vi kan koppla godtyckliga nyckel/värdepar till den för närvarande pågående goroutinen. Dessa etiketter ärvas automatiskt när en ny goroutin skapas, så de når in i alla hörn av din kod. Av avgörande betydelse är dessa etiketter också integrerade i CPU-profilern, så att de automatiskt hamnar i de CPU-profiler som den producerar.

Så för att implementera den här funktionen modifierade vi spårningskoden i vårt dd-trace-go-bibliotek för att automatiskt tillämpa etiketter som t.ex. span id och endpoint när ett nytt spann skapas. Dessutom tar vi bort etiketterna när spännet är klart. Ett förenklat exempel på denna implementering kan ses nedan:

func StartSpan(ctx context.Context, endpoint string) *span {
	span := &span{id: rand.Uint64(), restoreCtx: ctx}
	labels := pprof.Labels(
		"span_id", fmt.Sprintf("%d", span.id),
		"endpoint", endpoint,
	)
	pprof.SetGoroutineLabels(pprof.WithLabels(ctx, labels))
	return span
}

type span struct {
	id         uint64
	restoreCtx context.Context
}

func (s *span) Finish() {
	pprof.SetGoroutineLabels(s.restoreCtx)
}

Vår faktiska implementering är lite mer komplex och minskar även risken för att läcka PII (Personally Identifiable Information). Den täcker automatiskt HTTP- och gRPC-omslagen i vårt bidragspaket, såväl som alla anpassade spår som din applikation kan implementera.

När vår backend väl tar emot spårnings- och profileringsinformationen kan vi utföra de sökningar som behövs för att driva funktionerna som visades upp tidigare i det här inlägget.

Profileringsförbättringar i Go 1.18

Som en del av implementeringen av dessa nya funktioner gjorde vi en hel del tester, inklusive enhetstester, mikrobenchmarks, makrobenchmarks och mer. Som väntat dök detta upp problem i vår kod och gjorde det möjligt för oss att snabbt fixa dem.

Något mindre förväntat upptäckte vi också flera problem i Go-körningstiden som påverkade pprof-etiketternas noggrannhet, såväl som CPU-profilering i allmänhet. Den goda nyheten är att med hjälp av communityn, Go-underhållarna och bidrag från vår sida – alla dessa problem har åtgärdats i den kommande Go 1.18-versionen.

Om du är intresserad av alla detaljer om detta, kolla in det kompletterande inlägget: Profiling Improvements in Go 1.18.

Med det sagt, om du inte använder mycket cgo borde de nya funktionerna redan fungera utmärkt för dig i Go 1.17.

Feedback önskas

Jag letar just nu efter personer som är intresserade av att ta de här nya funktionerna en sväng för att få feedback.

Det spelar ingen roll om du är en befintlig eller potentiell kund, skicka bara ett mejl till mig så kan vi ställa in en 30 min zoom. För att söta affären svarar jag också gärna på allmänna Go-profileringsfrågor längs vägen :).

Bilaga: Komma igång

Om du vill komma igång snabbt kan du helt enkelt kopiera koden nedan till din ansökan.

Dessutom kan du kolla in denna fullt fungerande dd-trace-go-demo-applikation som visar en integration inklusive HTTP och PostgreSQL.

package main

import (
	"time"

	"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
	"gopkg.in/DataDog/dd-trace-go.v1/profiler"
)

func main() {
	const (
		env     = "dev"
		service = "example"
		version = "0.1"
	)

	tracer.Start(
		tracer.WithEnv(env),
		tracer.WithService(service),
		tracer.WithServiceVersion(version),
		tracer.WithProfilerCodeHotspots(true),
		tracer.WithProfilerEndpoints(true),
	)
	defer tracer.Stop()

	err := profiler.Start(
		profiler.WithService(service),
		profiler.WithEnv(env),
		profiler.WithVersion(version),

		// Enables CPU profiling 100% of the time to capture hotspot information
		// for all spans. Default is 25% right now, but this might change in the
		// next dd-trace-go release.
		profiler.CPUDuration(60*time.Second),
		profiler.WithPeriod(60*time.Second),
	)
	if err != nil {
		panic(err)
	}
	defer profiler.Stop()

	// 
}

Tack till min kollega Nick Ripley för att han recenserade det här inlägget.

— Felix Geisendörfer


Prenumerera på denna blogg via RSS eller E-post eller få små uppdateringar från mig via Kvittra.





Source link

Postagens Similares

  • 如果你接受了黄鼠狼的工作,那么你一定就是黄鼠狼

    尼克·比尔顿. (照片:盖蒂) 只有几个原因可能会导致您受聘从事一项您显然不具备资格的有声望的工作。一是“他们已经认可了你的天才”。如果你是这个人,那么你一定会强烈地得出结论,认为这就是原因。但这很少是解释。 另一种可能性是“雇用你的人是个白痴”。发生这种情况。许多现任美国内阁部长都是通过这种方式获得职位的。 不过,最可能的原因——这个原因常常让其他原因黯然失色——是“你愿意做即将到来的肮脏和令人厌恶的事情。”这就是为什么高层的奇怪招聘总是引起所有其他员工的恐惧。当然,也许你是一颗隐藏的宝石,但奥卡姆剃刀说你可能只是一个打手。 尼克·比尔顿(Nick Bilton)是《纽约时报》和《名利场》的前科技作家,也是几部纪录片的制作人。 刚刚受聘 担任《60分钟》新任主持人。当然,比尔顿拥有成功的媒体生涯,但他成功的本质从来不是“他是一个超级人物”。 聪明的 记者”,也从来没有“他在电视新闻方面经验丰富”。我从来不觉得有必要密切关注他的作品,所以我不想不公平地讽刺他,但他在我心目中一直被归入“那些因为付出了很多努力而拥有时尚眼镜而成功的人”的类别。 (这将带你 远的,如果你在正确的房间里。)雇用尼克·比尔顿来领导电视新闻史上最有传奇色彩和最相关的调查节目有点像雇用 NASCAR 车手作为通用汽车公司的首席执行官。我的意思是,是的,你在该领域有一些经验,但是………………。 这项工作还伴随着很多背景,这些背景如今笼罩在哥伦比亚广播公司总部上空,就像哥斯拉即将喷火一样。大卫·埃里森,世界上最富有的人之一的富有的孩子, 通缉 政府批准了派拉蒙和华纳兄弟的合并,因此他决定,作为一个经过深思熟虑的商业决策,剥夺哥伦比亚广播公司新闻的可信度,使其更讨好特朗普政府,为了完成这项任务,他让巴里·韦斯负责该网络,而她已经在羞辱和毁掉该机构的路上了。作为哥伦比亚广播公司新闻新闻形象皇冠上的明珠,《60 分钟》可信度的不断瓦解尤其引人注目。巴里轻而易举地介入并开始出于政治原因干预报道 射击 记者们提出反对,并在几个月内普遍摧毁了花了几十年时间建立起来的编辑声誉。种种迹象表明,《60 分钟》正在转变为更像哥伦比亚广播公司《周日早间》的节目——一档讲述小猫、名人的精彩故事以及美国有趣的琐事的节目,但不会冒犯任何拥有可能影响大卫·埃里森商业利益的权力的人。 (我不会太担心哥伦比亚广播公司成为另一个福克斯新闻。创建福克斯新闻的罗杰·艾尔斯是一个天才——一个邪恶的天才,但在为了政治目的而操纵电视媒体的实践中仍然是一个天才。巴里韦斯不是这样的天才。哥伦比亚广播公司新闻更有可能被变得愚蠢和毫无意义,而不是被转变为一个复杂的右翼宣传机构。) 分享 所以你可以想象,哥伦比亚广播公司新闻台的所有真正记者,尤其是《60 分钟》的记者,都处于紧张状态。尼克·比尔顿进来了,他是一个 精心修剪的胡茬 没有电视新闻编辑室的经验,好像一切都很好,很花花公子,他用一个 员工备忘录 上面写着这样的话,“在《60 分钟》的第一集中,迈克·华莱士说:‘如果这个广播达到我们希望的效果,它将报道现实。’”我想不出比这更好的 60 分钟北极星了。最重要的是,这意味着在故事选择、剪辑室和广播中对公平性的承诺。” 这是一个打手的话。这份备忘录上飘扬的红旗比苏联阅兵还要多。嘿嘿!让我提两个。首先,最引人注目的是:如果你走进一家重视编辑可信度的新闻编辑室,而最近编辑可信度被巴里·韦斯打着“公平”的幌子搞砸了,而你把“公平”作为备忘录的中心,那么你就是在以一种不太微妙的方式告诉每个人,你在那里继续搞破坏编辑可信度的公司项目。其次,也是稍微微妙一点的——比尔顿没有直接提及哥伦比亚广播公司每位记者心目中最重要的上下文怪物,从而暴露了自己是一个暴徒、一个软弱的小贩、一个公关人员、一个混淆者;与《60 分钟》的初衷背道而驰。 新闻业——真正的新闻业——首先对废话过敏。废话是新闻业的死敌。真正的新闻渴望成为废话的对立面。你可以成为一名伟大的记者,不需要有吸引力、友善、讨人喜欢、有魅力,只要你有决心铲除并揭露任何发现的废话。确实,很多记者都不讨人喜欢 因为 他们有这种品质。强有力的调查性新闻行动的理想领导者是一个聪明、有干劲、在任何其他情况下几乎都找不到工作的人,因为他们对用来掩盖富人和有权势者谎言的企业细节怀有病态的仇恨。愿意故意忽视亿万富翁老板破坏性的政治倾向可能对大多数职业都有好处,但如果你的职业应该涉及做真正的新闻工作,那就是一个非常糟糕的迹象。 如果你决定不提倡和捍卫废话,有些工作将不会提供给你。如果你决定从事安慰受苦者、折磨舒适者之类的职业,那么有些工作在任何情况下都不应该从事。如果你有自尊的话就不会。如果你关心我们所有人一直说我们关心的任何事情,那就不会了。这并不是什么高尚的言辞,旨在暗示记者是英雄;这是成千上万未出名、也永远不会出名的记者在整个职业生涯中都遵守的底线标准。因为他们是记者!不然你为什么要这样做呢?对于其中 98% 的人来说——所有这些人永远不会在《纽约时报》或《60 分钟》这样著名的地方找到工作——这个行业是一个工资低、声望低、高度不稳定的行业。成为一名记者的唯一好处就是你可以对有权势的人说废话。如果你对此不感兴趣,那就做点别的吧! 一旦你接手了打手的工作,每个人都会知道你是一个什么样的人。高薪买不回尊重。 如果你不喜欢与政权结盟的亿万富翁购买并削弱主要媒体的事实,那就支持独立媒体。支持独立媒体。选择一些你喜欢的独立媒体,并付费订阅。新的、更好的媒体版本只有在您的支持下才会存在。读者付费支持的东西会生存,读者不付费支持的东西不会生存。我们都是这个舞台的参与者。如果《How Things Work》是您喜欢的独立媒体场所之一,请花一点时间支持我们。这里有两种好方法: 您可以成为付费订阅者;您可以向朋友赠送付费订阅礼物。对于所有已经成为付费订阅者的人,我衷心感谢你们。 赠送订阅礼物 Source link

  • तुम्हाला तुमच्या SSG साठी मोठ्या तंत्रज्ञानाची गरज का आहे?

    📅 19 नोव्हेंबर 2025 | ⏱️ ~3 मिनिटे वाचा छोट्या, वैयक्तिक वेबसाइट्सना मोठ्या-टेक स्टॅटिक होस्टिंगची आवश्यकता का नाही आणि एक साधी स्थानिक बिल्ड आणि rsync वर्कफ्लो तुम्हाला जलद उपयोजन, अधिक नियंत्रण आणि खूप कमी अवलंबित्व कसे देते यावर एक नजर. ठीक आहे, म्हणून काल क्लाउडफ्लेअरने झोपा काढल्या आणि इंटरनेट विस्कळीत झाले. कॉन्फिगरेशन फाइल खूप मोठी…

  • द लॉस्ट जॉय ऑफ म्युझिक पायरसी: WhatCD, Oink आणि Spotify

    विनामूल्य संगीताचे हे काळजीपूर्वक आयोजित केलेले संग्रहण जितके रोमांचक होते तितकेच, मी माझ्या मित्रांना लगेच सामील होण्यासाठी आमंत्रित करू शकणार नाही. बारकाईने संरक्षित आणि अत्यंत मागणी असलेली आमंत्रणे प्राप्त करण्यासाठी, मला स्वत: अनेक टॉरेन्ट अपलोड करून “पॉवर यूजर” ची स्थिती प्राप्त करण्यासाठी वापरकर्ता वर्गांच्या श्रेणीमध्ये चढणे आवश्यक आहे. सुरुवातीला हे अनावश्यकपणे उच्चभ्रू आणि निसर्गात गेटकेप्ट…

  • Opplastingen (novelle)

    Mitt første forsøk på å bringe tilbake novellen på ~30 år. Jeg smilte da du åpnet øynene for den første dagen av resten av livet ditt. Vel, metaforisk. Jeg ville ha smilt hvis jeg kunne. I praksis spilte jeg den forhåndsinnstilte smileanimasjonen på skjermen nærmest deg. Jeg kunne selvfølgelig generere en bare for denne anledningen,…

  • விமர்சனம்: இங்கிலாந்து, இங்கிலாந்து (ஜூலியன் பார்ன்ஸ்)

    இங்கிலாந்து இங்கிலாந்து ‘வெற்று’ ஐல் ஆஃப் வைட்டில் இங்கிலாந்து தீம் பூங்காவை உருவாக்குவது பற்றிய கதை. மனிதனின் நிலம் இல்லை யாராவது? இந்த பூங்கா, காலப்போக்கில் மீண்டும் ஒன்றிணைக்கப்பட்ட கலாச்சாரம் மற்றும் வரலாற்றின் ஒரு தொகுப்பாக உள்ளது, அது ராபின் ஹூட் டி-டே விமானங்கள், அனைத்தும் தட்டையானது. மார்த்தா தனது அலுவலகத்தில் இருந்து முழு தீவையும் அனுபவிக்க முடியும். நூற்று ஒரு டால்மேஷியன்களுக்கு உணவளிப்பதை அவளால் பார்க்க முடியும், ஹவொர்த் பார்சனேஜில் த்ரோபுட்டை சரிபார்க்கவும், வைக்கோல் மெல்லும்…

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *