自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用OpenTelemetry Operator將可觀測(cè)數(shù)據(jù)發(fā)送到SigNoz

云計(jì)算 云原生
OpenTelemetry Operator 簡(jiǎn)化了在 Kubernetes 環(huán)境中部署和管理 OpenTelemetry Collector、OpenTelemetry Agent 等組件的流程。它可以通過(guò) CRD 對(duì) OpenTelemetry 組件進(jìn)行集中化的管理。

OpenTelemetry Operator 是一個(gè)用于部署和管理 OpenTelemetry 組件的 Kubernetes Operator。它是一個(gè)自定義的 Kubernetes 控制器,使用 Operator 模式自動(dòng)化了 OpenTelemetry 環(huán)境的部署、配置和管理過(guò)程。

OpenTelemetry Operator 簡(jiǎn)化了在 Kubernetes 環(huán)境中部署和管理 OpenTelemetry Collector、OpenTelemetry Agent 等組件的流程。它可以通過(guò) CRD 對(duì) OpenTelemetry 組件進(jìn)行集中化的管理。使用 OpenTelemetry Operator,可以輕松地在 Kubernetes 集群中創(chuàng)建、配置和管理 OpenTelemetry 組件的實(shí)例。它提供了許多有用的功能,例如自動(dòng)創(chuàng)建和管理配置文件、自動(dòng)注入收集器和代理配置、自動(dòng)監(jiān)視和擴(kuò)展等。

部署

這里我們使用 Helm Chart 來(lái)部署 OpenTelemetry Operator,首先添加 Helm Chart 倉(cāng)庫(kù):

$ helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
$ helm repo update

默認(rèn)情況下會(huì)部署一個(gè)準(zhǔn)入控制器,用于驗(yàn)證 OpenTelemetry Operator 的配置是否正確,為了使 APIServer 能夠與 Webhook 組件進(jìn)行通信,Webhook 需要一個(gè)由 APIServer 配置為可信任的 TLS 證書(shū)。有幾種不同的方法可以用來(lái)生成/配置所需的 TLS 證書(shū)。

  • 最簡(jiǎn)單的(默認(rèn))方法是安裝 cert-manager 并將 admissionWebhooks.certManager.create 設(shè)置為 true。這樣,cert-manager 就會(huì)生成一個(gè)自簽名的證書(shū)。
  • 可以通過(guò)配置 admissionWebhooks.certManager.issuerRef 值來(lái)提供自己的頒發(fā)者。需要指定類型(Issuer 或 ClusterIssuer)和名稱。請(qǐng)注意,此方法還是需要安裝 cert-manager。
  • 可以通過(guò)將 admissionWebhooks.certManager.enabled 設(shè)置為 false 并將 admissionWebhooks.autoGenerateCert 設(shè)置為 true 來(lái)使用自動(dòng)生成的自簽名證書(shū)。Helm 將創(chuàng)建一個(gè)自簽名證書(shū)和一個(gè)對(duì)應(yīng)的 Secret。
  • 可以通過(guò)將 admissionWebhooks.certManager.enabled 和 admissionWebhooks.autoGenerateCert 設(shè)置為 false 來(lái)使用自己生成的自簽名證書(shū)。需要向 admissionWebhooks.cert_file、admissionWebhooks.key_file 和 admissionWebhooks.ca_file 提供必要的值。
  • 可以通過(guò)禁用 .Values.admissionWebhooks.create 和 admissionWebhooks.certManager.enabled 來(lái)通過(guò)路徑掛載自定義 Webhooks 和證書(shū),同時(shí)在 admissionWebhooks.secretName 中設(shè)置自定義證書(shū) Secret 名稱。
  • 可以通過(guò)禁用 .Values.admissionWebhooks.create 并將 env var 設(shè)置為 ENABLE_WEBHOOKS: "false" 來(lái)完全禁用 Webhooks。

為了簡(jiǎn)單我們這里可以選擇第三種方式,直接使用自動(dòng)生成的自簽名證書(shū),直接使用下面的命令一鍵安裝 OpenTelemetry Operator:

$ helm upgrade --install --set admissionWebhooks.certManager.enabled=false --set admissionWebhooks.certManager.autoGenerateCert=true opentelemetry-operator open-telemetry/opentelemetry-operator --namespace kube-otel --create-namespace

Release "opentelemetry-operator" does not exist. Installing it now.
NAME: opentelemetry-operator
LAST DEPLOYED: Tue Sep  5 11:23:29 2023
NAMESPACE: kube-otel
STATUS: deployed
REVISION: 1
NOTES:
opentelemetry-operator has been installed. Check its status by running:
  kubectl --namespace kube-otel get pods -l "release=opentelemetry-operator"

Visit https://github.com/open-telemetry/opentelemetry-operator for instructions on how to create & configure OpenTelemetryCollector and Instrumentation custom resources by using the Operator.

正常部署完成后可以看到對(duì)應(yīng)的 Pod 已經(jīng)正常運(yùn)行:

$ kubectl get pods -n kube-otel -l app.kubernetes.io/name=opentelemetry-operator
NAME                                      READY   STATUS    RESTARTS   AGE
opentelemetry-operator-6f77dc895c-924gf   2/2     Running   0          3m30s

此外還會(huì)自動(dòng)為我們添加兩個(gè) OpenTelemetry 相關(guān)的 CRD:

$ kubectl get crd |grep opentelemetry
instrumentations.opentelemetry.io           2023-09-05T03:23:28Z
opentelemetrycollectors.opentelemetry.io    2023-09-05T03:23:28Z

到這里 OpenTelemetry Operator 就部署完成了。

配置

OpenTelemetry Operator 可以通過(guò) CRD 來(lái)管理 OpenTelemetry 組件,其有 3 種不同的部署模式可用:

  • DaemonSet
  • Sidecar
  • Deployment(默認(rèn)模式)

OpenTelemetryCollector 類型的 CustomResource 暴露一個(gè)名為 .Spec.Mode 的屬性,該屬性可用于指定收集器是否應(yīng)作為 DaemonSet、Sidecar 或 Deployment(默認(rèn))運(yùn)行。

Deployment 模式

我們可以訂閱一個(gè)如下所示的 OpenTelemetryCollector CRD,用來(lái)部署一個(gè) Deployment 模式的 OpenTelemetry Collector:

$ kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: simplest
spec:
  mode: deployment
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    processors:
      batch:
    exporters:
      logging:
    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch]
          exporters: [logging]
EOF

上面的 otelcol 示例使用 gRPC 和 HTTP 協(xié)議接收 OTLP 跟蹤數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行批處理并將其記錄到控制臺(tái)。應(yīng)用該資源對(duì)象后,OpenTelemetry Operator 將創(chuàng)建一個(gè)名為 simplest 的 Deployment,該 Deployment 將運(yùn)行一個(gè) OpenTelemetry Collector 實(shí)例,該實(shí)例將使用上面的配置來(lái)接收、處理和導(dǎo)出跟蹤數(shù)據(jù)。

$ kubectl get opentelemetrycollectors
NAME       MODE         VERSION   READY   AGE     IMAGE                                         MANAGEMENT
simplest   deployment   0.83.0    1/1     3m22s   otel/opentelemetry-collector-contrib:0.83.0   managed
$ kubectl get pods
NAME                                     READY   STATUS    RESTARTS       AGE
simplest-collector-6d9886f5d-shgdb       1/1     Running   0              3m30s
$ kubectl get svc
NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                        AGE
kubernetes                      ClusterIP   10.96.0.1        <none>        443/TCP                        179d
simplest-collector              ClusterIP   10.108.169.24    <none>        4317/TCP,4318/TCP              3m43s
simplest-collector-headless     ClusterIP   None             <none>        4317/TCP,4318/TCP              3m43s
simplest-collector-monitoring   ClusterIP   10.103.173.212   <none>        8888/TCP                       3m43s

接下來(lái)我們可以按照以下步驟來(lái)安裝一個(gè) telemetrygen 工具,然后將示例跟蹤發(fā)送到這個(gè)收集器進(jìn)行測(cè)試:

$ go install github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen@latest

然后轉(zhuǎn)發(fā) OTLP 服務(wù)的 gRPC 端口:

$ kubectl port-forward service/simplest-collector 4317

在另一個(gè)終端中,執(zhí)行以下命令以使用 telemetrygen 發(fā)送跟蹤數(shù)據(jù):

$ telemetrygen traces --traces 1 --otlp-endpoint localhost:4317 --otlp-insecure

然后我們可以查看采集器對(duì)應(yīng)的日志,正??梢钥吹饺缦滤镜娜罩荆?/p>

$ kubectl logs -l app.kubernetes.io/name=simplest-collector
2023-09-05T06:18:43.299Z        info    TracesExporter  {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 2}

最后,請(qǐng)確保清理 otelcol 實(shí)例。

$ kubectl delete otelcol simplest

DaemonSet 模式

同樣,OpenTelemetry Collector 實(shí)例可以使用 DaemonSet 模式部署,這確保所有(或部分)節(jié)點(diǎn)運(yùn)行收集器 pod 的副本。 對(duì)于 DaemonSet,只有 Spec.Mode 屬性會(huì)更新為 daemonset。而前面的 otelcol YAML 示例中的配置可以保持原樣,也可以根據(jù)需要進(jìn)行更新。

DaemonSet 適用于諸如日志收集守護(hù)程序、存儲(chǔ)守護(hù)程序和節(jié)點(diǎn)監(jiān)控守護(hù)程序等任務(wù)。在這些情況下,需要在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)收集器實(shí)例,以便從每個(gè)節(jié)點(diǎn)收集數(shù)據(jù),前面其實(shí)我們已經(jīng)介紹過(guò)。

Sidecar 模式

通過(guò)將 pod 注解 sidecar.opentelemetry.io/inject 設(shè)置為 true 或來(lái)自同一命名空間的具體 OpenTelemetryCollector 的名稱,可以將具有 OpenTelemetry Collector 的 sidecar 注入到基于 pod 的工作負(fù)載中。

如下所示是創(chuàng)建一個(gè)以 jaeger 作為輸入并將輸出記錄到控制臺(tái)的 Sidecar 的示例:

$ kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: my-sidecar
spec:
  mode: sidecar
  config: |
    receivers:
      jaeger:
        protocols:
          thrift_compact:
    processors:
    exporters:
      logging:
    service:
      pipelines:
        traces:
          receivers: [jaeger]
          processors: []
          exporters: [logging]
EOF

該示例將創(chuàng)建一個(gè)名為 my-sidecar 的 OpenTelemetry Collector sidecar,該 sidecar 將從 Jaeger 接收跟蹤數(shù)據(jù)并將其記錄到控制臺(tái)。

$ kubectl get opentelemetrycollectors
NAME         MODE      VERSION   READY   AGE   IMAGE   MANAGEMENT
my-sidecar   sidecar   0.83.0            11s           managed

接下來(lái),我們使用一個(gè) jaeger 示例鏡像來(lái)創(chuàng)建一個(gè) Pod,并將 sidecar.opentelemetry.io/inject 注解設(shè)置為 true:

$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: myapp
  annotations:
    sidecar.opentelemetry.io/inject: "true"  # 注入 otelcol sidecar
spec:
  containers:
  - name: myapp
    image: jaegertracing/vertx-create-span:operator-e2e-tests
    ports:
      - containerPort: 8080
        protocol: TCP
EOF

應(yīng)用該 Pod 后,OpenTelemetry Operator 會(huì)將上面定義的 my-sidecar 采集器作為 sidecar 注入到 Pod 中,該容器將運(yùn)行一個(gè) OpenTelemetry Collector 實(shí)例,該實(shí)例將使用上面的配置來(lái)接收、處理和導(dǎo)出跟蹤數(shù)據(jù)。

$ kubectl get pods myapp
NAME    READY   STATUS    RESTARTS   AGE
myapp   2/2     Running   0          110s

這里我們可以轉(zhuǎn)發(fā)下 myapp pod 的 8080 端口:

$ kubectl port-forward pod/myapp 8080:8080

然后在另一個(gè)終端中,使用 curl 發(fā)送 HTTP 請(qǐng)求:

$ curl http://localhost:8080
Hello from Vert.x!

然后可以查看 Sidecar 容器的輸出日志,正常可以看到如下所示的 Trace 日志:

$ kubectl logs pod/myapp -c otc-container
# .......
2023-09-05T06:45:56.648Z        info    TracesExporter  {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 4}
2023-09-05T06:45:56.648Z        info    TracesExporter  {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 5}
2023-09-05T06:46:04.638Z        info    TracesExporter  {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 4}
2023-09-05T06:46:04.638Z        info    TracesExporter  {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 5}

最后記得清理 Sidecar 和 myapp pod:

$ kubectl delete otelcol/my-sidecar
$ kubectl delete pod/myapp

OpenTelemetry 自動(dòng)埋點(diǎn)注入

OpenTelemetry Operator 除了可以管理 OpenTelemetry Collector 之外,還可以注入和配置 OpenTelemetry 自動(dòng)追蹤庫(kù)。

埋點(diǎn)資源配置

目前,支持 Java、NodeJS、Python 和 DotNet 語(yǔ)言的埋點(diǎn)。當(dāng)以下注解應(yīng)用于工作負(fù)載或命名空間時(shí),將啟用儀器化。

  • instrumentation.opentelemetry.io/inject-java: "true" — 對(duì)于 Java。
  • instrumentation.opentelemetry.io/inject-nodejs: "true" — 對(duì)于 NodeJS。
  • instrumentation.opentelemetry.io/inject-python: "true" — 對(duì)于 Python。
  • instrumentation.opentelemetry.io/inject-dotnet: "true" — 對(duì)于 DotNet。
  • instrumentation.opentelemetry.io/inject-sdk: "true" - 僅適用于 OpenTelemetry SDK 環(huán)境變量。

注解的可能值有:

  • true - 從命名空間注入和埋點(diǎn)資源。
  • my-instrumentation - 當(dāng)前命名空間中 Instrumentation CR 實(shí)例的名稱。
  • my-other-namespace/my-instrumentation - 另一個(gè)命名空間中 Instrumentation CR 實(shí)例的名稱和命名空間。
  • false -不注入。

在使用自動(dòng)插樁之前,我們需要使用 SDK 和插樁的配置來(lái)配置一個(gè) Instrumentation 資源。

Instrumentation 由以下屬性組成:

  • exporter.endpoint -(可選)將遙測(cè)數(shù)據(jù)發(fā)送到 OTLP 格式的地址。
  • propagators - 使所有數(shù)據(jù)源能夠共享底層上下文機(jī)制,用于在事務(wù)的整個(gè)生命周期中存儲(chǔ)狀態(tài)和訪問(wèn)數(shù)據(jù)。
  • sampler - 通過(guò)減少收集和發(fā)送到后端的跟蹤樣本數(shù)量來(lái)引入的噪音和開(kāi)銷的機(jī)制。 OpenTelemetry 提供兩種類型:StaticSampler 和 TraceIDRatioBased。
  • 語(yǔ)言屬性,即 java、nodejs、python 和 dotnet - 根據(jù) pod 注解中設(shè)置的語(yǔ)言,使用自動(dòng)插樁的自定義鏡像。

安裝 SigNoz

下面我們準(zhǔn)備使用 SigNoz 來(lái)作為 OTLP 接收器。SigNoz 是一個(gè)開(kāi)源 APM,它可以幫助開(kāi)發(fā)人員監(jiān)控他們的應(yīng)用程序并解決問(wèn)題,是 DataDog、NewRelic 等的開(kāi)源替代品。開(kāi)源應(yīng)用程序性能監(jiān)控 (APM) 和可觀察性工具。

要使用 SigNoz 自然我們需要首先安裝,同樣我們可以使用 Helm Chart 來(lái)部署 SigNoz:

$ helm repo add signoz https://charts.signoz.io
# 配置一個(gè)全局的 StorageClass 對(duì)象
$ helm upgrade --install signoz signoz/signoz --set global.storageClass=cfsauto --namespace kube-otel --create-namespace
Release "signoz" does not exist. Installing it now.
coalesce.go:175: warning: skipped value for zookeeper.initContainers: Not a table.
NAME: signoz
LAST DEPLOYED: Tue Sep  5 15:14:34 2023
NAMESPACE: kube-otel
STATUS: deployed
REVISION: 1
NOTES:
1. You have just deployed SigNoz cluster:

- frontend version: '0.28.0'
- query-service version: '0.28.0'
- alertmanager version: '0.23.3'
- otel-collector version: '0.79.6'
- otel-collector-metrics version: '0.79.6'

2. Get the application URL by running these commands:

  export POD_NAME=$(kubectl get pods --namespace kube-otel -l "app.kubernetes.io/name=signoz,app.kubernetes.io/instance=signoz,app.kubernetes.io/compnotallow=frontend" -o jsnotallow="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:3301 to use your application"
  kubectl --namespace kube-otel port-forward $POD_NAME 3301:3301


If you have any ideas, questions, or any feedback, please share on our Github Discussions:
  https://github.com/SigNoz/signoz/discussions/713

隔一會(huì)兒時(shí)間就可以看到對(duì)應(yīng)的 Pod 已經(jīng)正常運(yùn)行:

$ kubectl get pods -n kube-otel
NAME                                                READY   STATUS    RESTARTS   AGE
chi-signoz-clickhouse-cluster-0-0-0                 1/1     Running   0          7m17s
signoz-alertmanager-0                               1/1     Running   0          13m
signoz-clickhouse-operator-557bdb6b69-tl6qd         2/2     Running   0          13m
signoz-frontend-756fc84cfb-kn6gk                    1/1     Running   0          13m
signoz-k8s-infra-otel-agent-85bw7                   1/1     Running   0          13m
signoz-k8s-infra-otel-agent-8l49k                   1/1     Running   0          13m
signoz-k8s-infra-otel-deployment-86798ddf86-fskll   1/1     Running   0          13m
signoz-otel-collector-6675cb6b-mbzkt                1/1     Running   0          13m
signoz-otel-collector-metrics-c6b457469-554sj       1/1     Running   0          13m
signoz-query-service-0                              1/1     Running   0          13m
signoz-zookeeper-0                                  1/1     Running   0          13m
$ kubectl get svc -n kube-otel
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                          AGE
chi-signoz-clickhouse-cluster-0-0    ClusterIP   None             <none>        9000/TCP,8123/TCP,9009/TCP                       11m
signoz-alertmanager                  ClusterIP   10.110.225.12    <none>        9093/TCP                                         19m
signoz-alertmanager-headless         ClusterIP   None             <none>        9093/TCP                                         19m
signoz-clickhouse                    ClusterIP   10.106.164.155   <none>        8123/TCP,9000/TCP                                11m
signoz-clickhouse-operator-metrics   ClusterIP   10.109.230.187   <none>        8888/TCP                                         19m
signoz-frontend                      ClusterIP   10.99.154.149    <none>        3301/TCP                                         19m
signoz-k8s-infra-otel-agent          ClusterIP   10.104.11.195    <none>        13133/TCP,8888/TCP,4317/TCP,4318/TCP             19m
signoz-k8s-infra-otel-deployment     ClusterIP   10.96.76.96      <none>        13133/TCP                                        19m
signoz-otel-collector                ClusterIP   10.109.84.177    <none>        14250/TCP,14268/TCP,8888/TCP,4317/TCP,4318/TCP   19m
signoz-otel-collector-metrics        ClusterIP   10.96.121.34     <none>        13133/TCP                                        19m
signoz-query-service                 ClusterIP   10.105.122.9     <none>        8080/TCP,8085/TCP                                19m
signoz-zookeeper                     ClusterIP   10.100.202.59    <none>        2181/TCP,2888/TCP,3888/TCP                       19m
signoz-zookeeper-headless            ClusterIP   None             <none>        2181/TCP,2888/TCP,3888/TCP                       19m

然后我們可以使用下面的方式來(lái)訪問(wèn) SigNoz:

$ export POD_NAME=$(kubectl get pods --namespace kube-otel -l "app.kubernetes.io/name=signoz,app.kubernetes.io/instance=signoz,app.kubernetes.io/compnotallow=frontend" -o jsnotallow="{.items[0].metadata.name}")
$ kubectl --namespace kube-otel port-forward $POD_NAME 3301:3301

然后就可以通過(guò) http://127.0.0.1:3301 訪問(wèn) SigNoz 了:

第一次訪問(wèn)的時(shí)候需要?jiǎng)?chuàng)建一個(gè) admin 賬號(hào),根據(jù)頁(yè)面提示創(chuàng)建即可。創(chuàng)建后就可以進(jìn)入 SigNoz 的主界面了:

此外 SigNoz 還會(huì)采集 Kubernetes 集群的日志數(shù)據(jù),我們可以在 Logs 頁(yè)面查看:

到這里 SigNoz 就部署完成了。

注入 OpenTelemetry SDK 環(huán)境變量

我們可以通過(guò)使用 inject-sdk 來(lái)配置 OpenTelemetry SDK,以應(yīng)用于目前無(wú)法自動(dòng)插樁的應(yīng)用程序。這會(huì)注入環(huán)境變量,例如 OTEL_RESOURCE_ATTRIBUTES、OTEL_TRACES_SAMPLER 和 OTEL_EXPORTER_OTLP_ENDPOINT,可以在 Instrumentation 中進(jìn)行配置,但實(shí)際上不會(huì)提供 SDK。

下面我們來(lái)創(chuàng)建一個(gè)將 OTLP 接收器作為輸入和輸出的 Sidecar,將遙測(cè)數(shù)據(jù)發(fā)送到 SigNoz 采集器并將日志記錄到控制臺(tái)。

$ kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: my-sidecar
spec:
  mode: sidecar
  config: |
    receivers:
      otlp:
        protocols:
          http:
          grpc:
    processors:
      batch:
    exporters:
      logging:
      otlp:
        endpoint: http://signoz-otel-collector.kube-otel.svc.cluster.local:4317
        tls:
          insecure: true
    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch]
          exporters: [logging, otlp]
        metrics:
          receivers: [otlp]
          processors: [batch]
          exporters: [logging, otlp]
EOF

這里我們重新定義了一個(gè) Sidecar 模式的采集器,注意定義的 OTLP 導(dǎo)出器的 endpoint 地址為 http://signoz-otel-collector.kube-otel.svc.cluster.local:4317,這是上面我們安裝的 Signoz 采集器的地址,當(dāng)然也可以替換成你自己的 OTLP 接收器地址。

$ kubectl get opentelemetrycollectors
NAME         MODE      VERSION   READY   AGE    IMAGE   MANAGEMENT
my-sidecar   sidecar   0.83.0            102s           managed

使用 Sidecar

接下來(lái)可以創(chuàng)建一個(gè) Instrumentation 實(shí)例:

$ kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: my-instrumentation
spec:
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: parentbased_always_on
  java:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
  nodejs:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-nodejs:latest
  python:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-python:latest
  dotnet:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-dotnet:latest
EOF
$ kubectl get instrumentation
NAME                 AGE   ENDPOINT   SAMPLER                 SAMPLER ARG
my-instrumentation   7s               parentbased_always_on

在這個(gè)資源對(duì)象中,我們將 pod 的注解 instrumentation.opentelemetry.io/inject-java 和 sidecar.opentelemetry.io/inject 設(shè)置為 true,這樣可以在 Kubernetes 中配置工作負(fù)載的自動(dòng)埋點(diǎn)。它會(huì)將 OTLP 數(shù)據(jù)發(fā)送到 Sidecar,而 Sidecar 會(huì)將數(shù)據(jù)傳遞給 SigNoz 收集器。

比如下面的應(yīng)用程序:

$ kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-petclinic
spec:
  selector:
    matchLabels:
      app: spring-petclinic
  replicas: 1
  template:
    metadata:
      labels:
        app: spring-petclinic
      annotations:
        sidecar.opentelemetry.io/inject: "true"
        instrumentation.opentelemetry.io/inject-java: "true"
    spec:
      containers:
      - name: app
        image: cnych/spring-petclinic:latest
EOF

我們只需在 Pod 中添加 instrumentation.opentelemetry.io/inject-{language} 注解即可對(duì)已部署的工作負(fù)載啟用自動(dòng)檢測(cè)功能。

應(yīng)用上面的資源對(duì)象后,OpenTelemetry Operator 將創(chuàng)建一個(gè)名為 my-sidecar 的 OpenTelemetry Collector sidecar,該 sidecar 將從應(yīng)用程序接收跟蹤數(shù)據(jù)并將其發(fā)送到 SigNoz 采集器。

同樣我們將該應(yīng)用程序的 8080 端口轉(zhuǎn)發(fā)到本地:

$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
spring-petclinic-6bcb946c8-jgbfz   2/2     Running   0          28m
$ export POD_NAME=$(kubectl get pod -l app=spring-petclinic -o jsnotallow="{.items[0].metadata.name}")
$ kubectl port-forward ${POD_NAME} 8080:8080

現(xiàn)在我們?cè)跒g覽器中訪問(wèn) http://localhost:8080 后就可以來(lái)生成遙測(cè)數(shù)據(jù)了。

然后我們可以在 SigNoz 中查看到對(duì)應(yīng)的 Trace 數(shù)據(jù)。

最后讓我們來(lái)清理下這些資源對(duì)象:

$ kubectl delete deployment/spring-petclinic
$ kubectl delete instrumentation/my-instrumentation
$ kubectl delete otelcol/my-sidecar

無(wú)需 Sidecar 的自動(dòng)埋點(diǎn)

OpenTelemetry Operator 還支持無(wú)需 Sidecar 的自動(dòng)埋點(diǎn)。同樣我們這里創(chuàng)建將 OTLP 數(shù)據(jù)發(fā)送到 SigNoz 端點(diǎn)的 Instrumentation 實(shí)例:

$ kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: my-instrumentation
spec:
  exporter:
    endpoint: http://signoz-otel-collector.kube-otel.svc.cluster.local:4317
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: parentbased_traceidratio
    argument: "0.25"
  java:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
  nodejs:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-nodejs:latest
  python:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-python:latest
  dotnet:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-dotnet:latest
EOF

注意現(xiàn)在我們定義的 Instrumentation 實(shí)例中定義了 exporter.endpoint 屬性,這樣就可以將 OTLP 數(shù)據(jù)發(fā)送到 SigNoz 采集器了。

接下來(lái)我們只需要為我們?cè)?K8s 中部署的 Java 工作負(fù)載設(shè)置 pod 注解 instrumentation.opentelemetry.io/inject-java 為true 即可。

如下所示是一個(gè)帶有自動(dòng)埋點(diǎn)的 spring petclinic 的示例:

$ kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-petclinic
spec:
  selector:
    matchLabels:
      app: spring-petclinic
  replicas: 1
  template:
    metadata:
      labels:
        app: spring-petclinic
      annotations:
        instrumentation.opentelemetry.io/inject-java: "true"
    spec:
      containers:
      - name: app
        image: cnych/spring-petclinic:latest
EOF
$ kubectl get instrumentation
NAME                 AGE   ENDPOINT                                                        SAMPLER                    SAMPLER ARG
my-instrumentation   14s   http://signoz-otel-collector.kube-otel.svc.cluster.local:4317   parentbased_traceidratio   0.25

應(yīng)用部署后則只有一個(gè)容器,同樣我們將該應(yīng)用程序的 8080 端口轉(zhuǎn)發(fā)到本地:

$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
spring-petclinic-9f5fffc88-zt4qx   1/1     Running   0          4m45s
$ export POD_NAME=$(kubectl get pod -l app=spring-petclinic -o jsnotallow="{.items[0].metadata.name}")
$ kubectl port-forward ${POD_NAME} 8080:8080

然后在瀏覽器中訪問(wèn) http://localhost:8080 后就可以來(lái)生成遙測(cè)數(shù)據(jù)了。

如果在日志數(shù)據(jù)中加入了 traceId 和 spanId,我們就可以在 SigNoz 中將 trace 和 logs 數(shù)據(jù)關(guān)聯(lián)起來(lái)了。SigNoz 還有報(bào)警、Dashboard 等功能,更多功能可以參考 SigNoz 官方文檔(https://signoz.io/docs/)。

責(zé)任編輯:姜華 來(lái)源: k8s技術(shù)圈
相關(guān)推薦

2023-02-08 17:55:45

SigNoz開(kāi)源工具

2021-05-04 18:28:23

Apache KafkSigNoz開(kāi)源

2024-05-28 09:37:48

2023-07-26 00:12:04

2022-03-24 17:56:51

數(shù)據(jù)平臺(tái)觀測(cè)

2010-05-31 15:34:34

MySQL數(shù)據(jù)庫(kù)

2021-02-18 07:46:07

日志框架

2010-05-27 15:56:56

MySQL數(shù)據(jù)庫(kù)

2010-06-30 12:37:04

SNMP服務(wù)器

2021-10-08 10:05:10

數(shù)據(jù)包三次握手HTTP

2022-04-10 23:43:11

代碼發(fā)送郵件后端

2021-05-17 05:07:41

Linux掃描儀Samba共享

2022-06-07 13:48:25

可觀測(cè)性架構(gòu)系統(tǒng)開(kāi)發(fā)

2021-11-19 09:40:50

數(shù)據(jù)技術(shù)實(shí)踐

2023-10-26 08:47:30

云原生數(shù)據(jù)采集

2025-01-03 08:08:56

2022-06-22 16:31:26

阿里云數(shù)字化轉(zhuǎn)型云原生

2023-03-09 08:00:22

2023-05-18 22:44:09

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)