使用OpenTelemetry Operator将可观测数据发送到SigNoz

WilliamGates
发布于 2023-11-23 14:20
浏览
0收藏

安装 SigNoz

下面我们准备使用 SigNoz 来作为 OTLP 接收器。SigNoz 是一个开源 APM,它可以帮助开发人员监控他们的应用程序并解决问题,是 DataDog、NewRelic 等的开源替代品。开源应用程序性能监控 (APM) 和可观察性工具。

要使用 SigNoz 自然我们需要首先安装,同样我们可以使用 Helm Chart 来部署 SigNoz:

$ helm repo add signoz https://charts.signoz.io
# 配置一个全局的 StorageClass 对象
$ 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/component=frontend" -o jsonpath="{.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

隔一会儿时间就可以看到对应的 Pod 已经正常运行:

$ 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

然后我们可以使用下面的方式来访问 SigNoz:

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

然后就可以通过 ​​http://127.0.0.1:3301​​ 访问 SigNoz 了:

使用OpenTelemetry Operator将可观测数据发送到SigNoz-鸿蒙开发者社区

第一次访问的时候需要创建一个 admin 账号,根据页面提示创建即可。创建后就可以进入 SigNoz 的主界面了:

使用OpenTelemetry Operator将可观测数据发送到SigNoz-鸿蒙开发者社区

此外 SigNoz 还会采集 Kubernetes 集群的日志数据,我们可以在 ​Logs​ 页面查看:

使用OpenTelemetry Operator将可观测数据发送到SigNoz-鸿蒙开发者社区

到这里 SigNoz 就部署完成了。

注入 OpenTelemetry SDK 环境变量

我们可以通过使用 ​​inject-sdk​​​ 来配置 OpenTelemetry SDK,以应用于目前无法自动插桩的应用程序。这会注入环境变量,例如 ​​OTEL_RESOURCE_ATTRIBUTES​​​、​​OTEL_TRACES_SAMPLER​​​ 和 ​​OTEL_EXPORTER_OTLP_ENDPOINT​​​,可以在 ​​Instrumentation​​ 中进行配置,但实际上不会提供 SDK。

下面我们来创建一个将 OTLP 接收器作为输入和输出的 Sidecar,将遥测数据发送到 SigNoz 采集器并将日志记录到控制台。

$ 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

这里我们重新定义了一个 Sidecar 模式的采集器,注意定义的 OTLP 导出器的 endpoint 地址为 ​​http://signoz-otel-collector.kube-otel.svc.cluster.local:4317​​,这是上面我们安装的 Signoz 采集器的地址,当然也可以替换成你自己的 OTLP 接收器地址。

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

使用 Sidecar

接下来可以创建一个 ​​Instrumentation​​ 实例:

$ 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

在这个资源对象中,我们将 pod 的注解 ​​instrumentation.opentelemetry.io/inject-java​​​ 和 ​​sidecar.opentelemetry.io/inject​​​ 设置为 ​​true​​,这样可以在 Kubernetes 中配置工作负载的自动埋点。它会将 OTLP 数据发送到 Sidecar,而 Sidecar 会将数据传递给 SigNoz 收集器。

比如下面的应用程序:

$ 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}​​ 注解即可对已部署的工作负载启用自动检测功能。

应用上面的资源对象后,OpenTelemetry Operator 将创建一个名为 ​​my-sidecar​​ 的 OpenTelemetry Collector sidecar,该 sidecar 将从应用程序接收跟踪数据并将其发送到 SigNoz 采集器。

同样我们将该应用程序的 8080 端口转发到本地:

$ 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 jsonpath="{.items[0].metadata.name}")
$ kubectl port-forward ${POD_NAME} 8080:8080

现在我们在浏览器中访问 ​​http://localhost:8080​​ 后就可以来生成遥测数据了。

使用OpenTelemetry Operator将可观测数据发送到SigNoz-鸿蒙开发者社区

然后我们可以在 SigNoz 中查看到对应的 Trace 数据。

使用OpenTelemetry Operator将可观测数据发送到SigNoz-鸿蒙开发者社区


使用OpenTelemetry Operator将可观测数据发送到SigNoz-鸿蒙开发者社区

最后让我们来清理下这些资源对象:

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

无需 Sidecar 的自动埋点

OpenTelemetry Operator 还支持无需 Sidecar 的自动埋点。同样我们这里创建将 OTLP 数据发送到 SigNoz 端点的 ​​Instrumentation​​ 实例:

$ 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

注意现在我们定义的 Instrumentation 实例中定义了 ​​exporter.endpoint​​ 属性,这样就可以将 OTLP 数据发送到 SigNoz 采集器了。

接下来我们只需要为我们在 K8s 中部署的 Java 工作负载设置 pod 注解 ​​instrumentation.opentelemetry.io/inject-java​​​ 为​​true​​ 即可。

如下所示是一个带有自动埋点的 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

应用部署后则只有一个容器,同样我们将该应用程序的 8080 端口转发到本地:

$ 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 jsonpath="{.items[0].metadata.name}")
$ kubectl port-forward ${POD_NAME} 8080:8080

然后在浏览器中访问 ​​http://localhost:8080​​ 后就可以来生成遥测数据了。

使用OpenTelemetry Operator将可观测数据发送到SigNoz-鸿蒙开发者社区

如果在日志数据中加入了 traceId 和 spanId,我们就可以在 SigNoz 中将 trace 和 logs 数据关联起来了。SigNoz 还有报警、Dashboard 等功能,更多功能可以参考 ​​SigNoz 官方文档​​(https://signoz.io/docs/)。



文章转载自公众号:k8s技术圈

分类
标签
已于2023-11-23 14:20:20修改
收藏
回复
举报
回复
    相关推荐