OpenTelemetry
完成此任務後,您將了解如何讓您的應用程式參與使用 OpenTelemetry 的追蹤,無論您使用哪種語言、框架或平台來建置您的應用程式。
此任務使用 Bookinfo 範例作為範例應用程式,並使用 OpenTelemetry 收集器 作為追蹤的接收器。
若要了解 Istio 如何處理追蹤,請造訪此任務的概觀。
部署 OpenTelemetry 收集器
為 OpenTelemetry 收集器建立命名空間
$ kubectl create namespace observability
部署 OpenTelemetry 收集器。您可以使用此範例組態作為起點:
otel.yaml
$ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n observability
安裝
所有追蹤選項都可以透過 MeshConfig
全域設定。為簡化設定,建議建立單一 YAML 檔案,您可以將其傳遞給 istioctl install -f
命令。
選擇匯出器
Istio 可以設定為透過 gRPC 或 HTTP 匯出 OpenTelemetry Protocol (OTLP) 追蹤。一次只能設定一個匯出器(gRPC 或 HTTP)。
透過 gRPC 匯出
在這個範例中,追蹤資料將透過 OTLP/gRPC 匯出至 OpenTelemetry Collector。此範例還啟用了環境資源偵測器。環境偵測器會將來自環境變數 OTEL_RESOURCE_ATTRIBUTES
的屬性新增至匯出的 OpenTelemetry 資源。
$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
extensionProviders:
- name: otel-tracing
opentelemetry:
port: 4317
service: opentelemetry-collector.observability.svc.cluster.local
resource_detectors:
environment: {}
EOF
透過 HTTP 匯出
在這個範例中,追蹤資料將透過 OTLP/HTTP 匯出至 OpenTelemetry Collector。此範例還啟用了環境資源偵測器。環境偵測器會將來自環境變數 OTEL_RESOURCE_ATTRIBUTES
的屬性新增至匯出的 OpenTelemetry 資源。
$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
extensionProviders:
- name: otel-tracing
opentelemetry:
port: 4318
service: opentelemetry-collector.observability.svc.cluster.local
http:
path: "/v1/traces"
timeout: 5s
headers:
- name: "custom-header"
value: "custom value"
resource_detectors:
environment: {}
EOF
透過遙測 API 啟用網格追蹤
套用以下組態來啟用追蹤功能
$ kubectl apply -f - <<EOF
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: otel-demo
spec:
tracing:
- providers:
- name: otel-tracing
randomSamplingPercentage: 100
customTags:
"my-attribute":
literal:
value: "default-value"
EOF
部署 Bookinfo 應用程式
部署Bookinfo範例應用程式。
使用 Bookinfo 範例產生追蹤
當 Bookinfo 應用程式啟動並執行後,存取
http://$GATEWAY_URL/productpage
一次或多次,以產生追蹤資訊。若要查看追蹤資料,您必須向您的服務傳送請求。請求的數量取決於 Istio 的取樣率,並且可以使用遙測 API進行配置。在預設的 1% 取樣率下,您需要傳送至少 100 個請求才能看到第一個追蹤。要向
productpage
服務傳送 100 個請求,請使用以下命令$ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
範例中使用的 OpenTelemetry Collector 配置為將追蹤資料匯出到主控台。如果您使用了範例的 Collector 配置,您可以查看 Collector 日誌來驗證追蹤資料是否已到達。它應該包含類似以下內容:
Resource SchemaURL: Resource labels: -> service.name: STRING(productpage.default) ScopeSpans #0 ScopeSpans SchemaURL: InstrumentationScope Span #0 Trace ID : 79fb7b59c1c3a518750a5d6dad7cd2d1 Parent ID : 0cf792b061f0ad51 ID : 2dff26f3b4d6d20f Name : egress reviews:9080 Kind : SPAN_KIND_CLIENT Start time : 2024-01-30 15:57:58.588041 +0000 UTC End time : 2024-01-30 15:57:59.451116 +0000 UTC Status code : STATUS_CODE_UNSET Status message : Attributes: -> node_id: STRING(sidecar~10.244.0.8~productpage-v1-564d4686f-t6s4m.default~default.svc.cluster.local) -> zone: STRING() -> guid:x-request-id: STRING(da543297-0dd6-998b-bd29-fdb184134c8c) -> http.url: STRING(http://reviews:9080/reviews/0) -> http.method: STRING(GET) -> downstream_cluster: STRING(-) -> user_agent: STRING(curl/7.74.0) -> http.protocol: STRING(HTTP/1.1) -> peer.address: STRING(10.244.0.8) -> request_size: STRING(0) -> response_size: STRING(441) -> component: STRING(proxy) -> upstream_cluster: STRING(outbound|9080||reviews.default.svc.cluster.local) -> upstream_cluster.name: STRING(outbound|9080||reviews.default.svc.cluster.local) -> http.status_code: STRING(200) -> response_flags: STRING(-) -> istio.namespace: STRING(default) -> istio.canonical_service: STRING(productpage) -> istio.mesh_id: STRING(cluster.local) -> istio.canonical_revision: STRING(v1) -> istio.cluster_id: STRING(Kubernetes) -> my-attribute: STRING(default-value)
清除
移除遙測資源
$ kubectl delete telemetry otel-demo
使用 control-C 或以下命令移除任何可能仍在執行的
istioctl
程序$ killall istioctl
解除安裝 OpenTelemetry Collector
$ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability $ kubectl delete namespace observability
如果您不打算探索任何後續任務,請參閱Bookinfo 清理說明來關閉應用程式。