eBPFã使ã£ãOpenTelemetryã®Goèªåè¨è£ ã©ã¤ãã©ãªã調ã¹ã
opentelemetry-go-instrumentation
ã¨ããGoã§OpenTelemetryã®èªåè¨è£
ãå®ç¾ããã©ã¤ãã©ãªãç¥ãã¾ãããeBPFãæ´»ç¨ãã¦ããããã§ãããã®ã©ã¤ãã©ãªãå®éã«åããã¦ã¿ãªããç°¡åã«èª¿ã¹ã¦ã¿ã¾ãã
opentelemetry-go-instrumentation
ã¯Work in Progress(v0.8.0-alpha
)ã¨ãªã£ã¦ãã¾ãããã®å¾å¤§ããå¤ãã£ã¦ããå¯è½æ§ã«ã注æããèªåè¨è£ ã¨ã¯ï¼
OpenTelemetryãä¸å¿ã¨ããåæ£ãã¬ã¼ã·ã³ã°ã§ã¯ãContextãä¼æãããMetrics, Logs, Tracesãåºåãããããããã®è¨è£ (Instrumentation)ãã¢ããªã±ã¼ã·ã§ã³ã«æ½ãå¿ è¦ãããã¾ãããã®ä½æ¥ã¯ã¢ããªã±ã¼ã·ã§ã³ã«æãå ããå¿ è¦ãããæéã§ããããã§è¨è£ ãèªååãããã¤ã¾ãã¢ããªã±ã¼ã·ã§ã³ã®ã³ã¼ãã«æãå ããã«å®ç¾ããæ¹æ³ãJavaãªã©ã§å®ç¾ããã¦ãã¾ã1ã
ãããGoã¯JavaãPythonãªã©ã¨ã¯éã£ã¦ããã·ã³ã³ã¼ãã«ãã¤ãã£ãã«ã³ã³ãã¤ã«ããã¾ãããã®ããå®è¡æã«ã³ã¼ãã追å ãããã¨ãã§ãã¾ãããå°ãªãã¨ãèªåã¯Goã§ã®èªåè¨è£ ã¯é£ããã¨æã£ã¦ãã¾ãã2ã
ä»åç´¹ä»ããopentelemetry-go-instrumentation
ã¯eBPFã使ã£ã¦Goã§ã®èªåè¨è£
ãå®ç¾ãããã¨è©¦ã¿ã¦ãã¾ãã
eBPFã¨ã¯ï¼
eBPFã¯ã«ã¼ãã«ç©ºéã®ãµã³ãããã¯ã¹ç°å¢ã§å®å ¨ã«ã¦ã¼ã¶ã¼å®ç¾©ã®ããã°ã©ã ãå®è¡ããLinuxã®æè¡ã§ããNetworkingãä¸å¿ã¨ãã¦ObservabilityãTracingã®åéã§ã®ç 究éçºãçãã§ããèªåãèªãã è«æãããã¤ãç°¡åã«ç´¹ä»ãã¦ããã®ã§ãããã°ã覧ãã ããã
å人çã«ã¯Ciliumãä¸å¿ã¨ãã¦ã³ã³ãããããã¯ã¼ã¯é¢é£ã§ãã使ãããå°è±¡ãæã£ã¦ãã¾ãã
opentelemetry-go-instrumentation
ã§ã¯ãeBPFãç¨ãã¦å®è¡ããã»ã¹ã®ã³ã¼ãã¨å¤æ°ã«attachãã¦ããããã§ãã
åããã¦ã¿ã
調ã¹ãåã«åããã¦ã¿ã¾ããgetting-started3ãããã®ã§ããã«å¾ãã¾ãã
æºå
kindã§k8sã¯ã©ã¹ã¿ä½æ&imageããã¼ã
$ kind create cluster --name=otel-go-inst
$ make docker-build
$ kind load docker-image otel-go-instrumentation --name=otel-go-inst
ã¢ããªã±ã¼ã·ã§ã³ããããã¤
$ kubectl apply -k docs/getting-started/emojivoto/
namespace/emojivoto created
serviceaccount/emoji created
serviceaccount/voting created
serviceaccount/web created
service/emoji-svc created
service/voting-svc created
service/web-svc created
deployment.apps/emoji created
deployment.apps/vote-bot created
deployment.apps/voting created
deployment.apps/web created
Jaegerããããã¤
$ kubectl apply -f docs/getting-started/jaeger.yaml -n emojivoto
deployment.apps/jaeger created
service/jaeger created
$ kubectl port-forward svc/jaeger 16686:16686 -n emojivoto
è¨è£ å
è¨è£ åã«ã©ããªã¢ããªã±ã¼ã·ã§ã³ãè¦ã¦ã¿ã¾ãã
$ kubectl port-forward svc/web-svc 8080:80 -n emojivoto
çµµæåãæ票ããã¢ããªã±ã¼ã·ã§ã³ã®ããã§ããããã¤ããªã¯ã¨ã¹ããéã£ã¦ããJaegerãè¦ã¦ãTraceã¯è¦ãã¾ããã
è¨è£ å¾
è¨è£ ãããã¼ã¸ã§ã³ã®ã¢ããªã±ã¼ã·ã§ã³ããããã¤
$ kubectl apply -f docs/getting-started/emojivoto-instrumented.yaml -n emojivoto
deployment.apps/emoji configured
deployment.apps/voting configured
deployment.apps/web configured
è¨è£ ç¨ã®ã³ã³ããå®ç¾©ã¯ãã¡ããç¹æ¨©ãä¸ããä¸ã§è¨è£ 対象ã®ã³ã³ããã¨åãPodã§åä½ããã&ããã»ã¹åå空éãå ±æãã4ãã¨ã§å®ç¾ãã¦ãã¾ããã³ã³ããå®ç¾©ã追å ããã ãã§ã¢ããªã±ã¼ã·ã§ã³ã®ã³ã¼ãã»ã¤ã¡ã¼ã¸ã«ã¯å¤æ´ã¯ããã¾ããã
åã³ã¢ããªã±ã¼ã·ã§ã³ãæä½ãã¦ããJaegerãè¦ã¾ã5ã ããã§ã¢ããªã±ã¼ã·ã§ã³ãJaegerããconnection refusedããã¦ãããã¨ã«æ°ã¥ãã¾ããã
2023/11/30 15:41:05 traces export: Post "http://jaeger:4318/v1/traces": dial tcp 10.96.187.248:4318: connect: connection refused
imageãjaegertracing/opentelemetry-all-in-one
ããjaegertracing/all-in-one
ã«å¤æ´ãããåããã®ã§ãPRãupstreamã«æãã¦ããã¾ããã
ããã ãã§ããªã詳細ãªTraceãè¦ããã¨ãã§ãã¾ããã ã¡ãªã¿ã«ãªãã¨ãªãã¢ããªã±ã¼ã·ã§ã³ã®åä½ãéããªã£ãæ°ããã¾ããæ°ã®ããã§ãããããã¡ããã¨è¨æ¸¬ãã¦ã¿ãªãã¨åããã¾ãããã
ä»çµã¿
ããã¥ã¡ã³ããèªãã§ããã¾ã6ã
è¨è£ ãå¿ è¦ãªå¦çã¯å¤§ãã以ä¸ã®3ã¤ã§ãã
- HTTP/gRPCã®ãªã¯ã¨ã¹ãã»ã¬ã¹ãã³ã¹ã®SpanContext7ãèªã¿æ¸ããã
- Spanãä½æãã
- SpanContextãeBPF Mapã«æ ¼ç´ãã
eBPFããã°ã©ã ã¯ã¹ã¿ãã¯ã¨CPUã¬ã¸ã¹ã¿ã解æãã¦ã¦ã¼ã¶ã¼ã³ã¼ãã¨å¤æ°ã«ã¢ã¯ã»ã¹ãã¾ãããã®ã¨ãhttp.Requestã®ãããªæ§é ä½ã®SpanContextãèªã¿æ¸ãããããã«ã¯ãæ§é ä½å
ã®ãã®ãã£ã¼ã«ãã®ãªãã»ãããç¥ãå¿
è¦ãããã¾ããããããªãã»ããã¯æ§é ä½å®ç¾©ãå¤æ´ããããã³ã«å¤åãã¾ããããã§ãªãã»ããã解æãããã®æ
å ±ããã¼ã¸ã§ã³ã»æ§é ä½ãã¨ã«JSONã«ä¿åãã¦ãããã®ãoffsets-tracker
ã§ãã
1ã§ã¯offsets-tracker
ãå©ç¨ãã¦ãhttp.Requestãgrpc.ClientConnã¨ãã£ãæ§é ä½ã®SpanContextãèªã¿æ¸ããã¦ããããã§ãã
2ã§ã¯é©åãªä½ç½®ã§èªåã§Spanãä½æãã¾ããä¾ãã°HTTP Serverã®ãã³ãã©å ã§gRPCã®ãªã¯ã¨ã¹ããéä¿¡ããã¨ãã«Spanãä½æãã¾ãã ã¾ããã®ã©ã¤ãã©ãªã¯æåã§ä½æããã¹ãã³ã«ã対å¿ãã¦ãã¾ãããã®å ´åã¯SpanContextãæ´æ°ãã¾ãã
3ã§ã¯SpanContextãeBPF Mapã«æ ¼ç´ãããã¨ã§ãåãgoroutineå ã®ä»ã®å ´æã§SpanContextãå©ç¨ã§ããããã«ãã¦ãã¾ããä¾ãã°åãåã£ãHTTPãªã¯ã¨ã¹ãã®SpanContextãeBPF Mapã«æ ¼ç´ããæå¾HTTPã¬ã¹ãã³ã¹ãè¿ãéã«åãåºãã¦æ¸ãè¾¼ãã¨ãã£ãæµãã§ããSpanContextã®æ´æ°ã¯ã1ã§æ°ããªSpanãåãåã£ãéã2ã§ç¾å¨ã®Spanãæ´æ°ãããéã«å¿ è¦ã§ãã
ç¾å¨ã®å®è£ ã§ã¯eBPF Mapã®Keyãgoroutine IDã«ãValueãSpanContextã¨ãã¦ãã¾ãããã®ããè¤æ°goroutineã«è·¨ã£ãSpanContextã®å ±æã¯é£ããããã§ããå°æ¥çã«ã¯goroutineã®æ¨æ§é ã®ä¾åé¢ä¿ããã©ããã³ã°ãããã¨ãèãã¦ããããã§ãã
ä»ã«ã¯ãSpanã®éå§ã»çµäºæã«ã¿ã¤ã ã¹ã¿ã³ããåå¾ããå¿
è¦ãããã¾ããé¢æ°ã®æå¾ã§eBPFã³ã¼ããå¼ã³åºãuretprobes
ã¯Goã¨ã®ç¸æ§ãæªããããã代ããã«return
å¥ãæ¤åºãã¦ç´åã«uprobes
ãç½®ããã¨ã§çµäºã¿ã¤ã ã¹ã¿ã³ããåéããeBPFã³ã¼ããå¼ã³åºãã¦ããããã§ãã
çµããã«
ããã¥ã¡ã³ããæ´åããã¦ããé常ã«èª¿ã¹ãããã£ãã§ããä»åã¯å®è£ ã¾ã§ã¡ããã¨èªãã¦ããªãã®ã§æ¬¡ã¯ãã£ã¨èª¿ã¹ã¦ã¿ããã¨æã£ã¦ãã¾ãã
éçºãé²ãã§ãã£ã¨è²ã ãªç¶æ³ã§ä½¿ç¨ã§ãããé常ã«ä¾¿å©ã ã¨æãã¾ãããä¸æ¹ã§å®ç¾æ¹æ³ã®ã´ãªæ¼ãæã»åä½ãéãå¯è½æ§ã»ã³ã³ããã«ç¹æ¨©ãä¸ããã»ãã¥ãªãã£ä¸ã®åé¡ãæ°ã«ãªãã¾ããå¼ãç¶ã追ã£ã¦ããããã¨æãã¾ãã
https://github.com/open-telemetry/opentelemetry-java-instrumentation ↩︎
ä»èªåãéçºä¸ã®PiCoPã§ãåæ§ã«è¨è£ ãå¿ è¦ã§ãã®æéã課é¡ã§ãã ↩︎
https://github.com/open-telemetry/opentelemetry-go-instrumentation/tree/v0.8.0-alpha/docs/getting-started ↩︎
https://kubernetes.io/ja/docs/tasks/configure-pod-container/share-process-namespace/ ↩︎
é©å½ã«æ票ãã¦ãããBotããããã¤ããã¦ããã®ã§æä½ããªãã¦ãããã£ãã£ã½ãã§ã ↩︎
https://github.com/open-telemetry/opentelemetry-go-instrumentation/tree/v0.8.0-alpha/docs ↩︎
TraceID, SpanIDãªã©ãå«ãã ãã® ↩︎