美文网首页
在k8s中使用OpenTelemetry auto-instru

在k8s中使用OpenTelemetry auto-instru

作者: wwq2020 | 来源:发表于2021-11-24 13:39 被阅读0次

    原文

    创建collector

    apiVersion: opentelemetry.io/v1alpha1
    kind: OpenTelemetryCollector
    metadata:
      name: otel
    spec:
      config: |
        receivers:
          otlp:
            protocols:
              grpc:
              http:
        processors:
    
        exporters:
          logging:
    
        service:
          pipelines:
            traces:
              receivers: [otlp]
              processors: []
              exporters: [logging]
    

    会自动创建configmap,serviceaccount,service, deployment/daemonset/statefulset

    service name为crd的name后面加-collector

    创建Instrumentation

    内容如下

    apiVersion: opentelemetry.io/v1alpha1
    kind: Instrumentation
    metadata:
      name: my-instrumentation
    spec:
      exporter:
        endpoint: http://otel-collector: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
    

    创建deployment

    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: ghcr.io/pavolloffay/spring-petclinic:latest
    

    自动注入以下环境变量到pod的第一个容器中,用于sdk的相应配置

    OTEL_SERVICE_NAME
    OTEL_EXPORTER_OTLP_ENDPOINT
    OTEL_RESOURCE_ATTRIBUTES
    OTEL_PROPAGATORS,OTEL_TRACES_SAMPLER
    OTEL_TRACES_SAMPLER_ARG
    

    相关代码

    代码仓库github.com/open-telemetry/opentelemetry-operator

    main.go中

    func main() {
        ...
        mgr.GetWebhookServer().Register("/mutate-v1-pod", &webhook.Admission{
                Handler: webhookhandler.NewWebhookHandler(cfg, ctrl.Log.WithName("pod-webhook"), mgr.GetClient(),
                    []webhookhandler.PodMutator{
                        sidecar.NewMutator(logger, cfg, mgr.GetClient()),
                        instrumentation.NewMutator(logger, mgr.GetClient()),
                    }),
        })
        ...
    }
    

    pkg/instrumentation/podmutator.go中

    func NewMutator(logger logr.Logger, client client.Client) *instPodMutator {
        return &instPodMutator{
            Logger: logger,
            Client: client,
            sdkInjector: &sdkInjector{
                logger: logger,
                client: client,
            },
        }
    }
    
    func (pm *instPodMutator) Mutate(ctx context.Context, ns corev1.Namespace, pod corev1.Pod) (corev1.Pod, error) {
        ...
        return pm.sdkInjector.inject(ctx, insts, ns, pod), nil
    }
    

    pkg/instrumentation/sdk.go中

    func (i *sdkInjector) inject(ctx context.Context, insts languageInstrumentations, ns corev1.Namespace, pod corev1.Pod) corev1.Pod {
        ...
        if insts.Java != nil {
            otelinst := *insts.Java
            i.logger.V(1).Info("injecting java instrumentation into pod", "otelinst-namespace", otelinst.Namespace, "otelinst-name", otelinst.Name)
            pod = i.injectCommonSDKConfig(ctx, otelinst, ns, pod)
            pod = injectJavaagent(i.logger, otelinst.Spec.Java, pod)
        }
        ...
        return pod
    }
    
    func (i *sdkInjector) injectCommonSDKConfig(ctx context.Context, otelinst v1alpha1.Instrumentation, ns corev1.Namespace, pod corev1.Pod) corev1.Pod {
        container := &pod.Spec.Containers[0]
        resourceMap := i.createResourceMap(ctx, otelinst, ns, pod)
        idx := getIndexOfEnv(container.Env, envOTELServiceName)
        if idx == -1 { 
            container.Env = append(container.Env, corev1.EnvVar{
                Name:  envOTELServiceName,
                Value: chooseServiceName(pod, resourceMap),
            })
        }
        ...
    }
    

    相关文章

      网友评论

          本文标题:在k8s中使用OpenTelemetry auto-instru

          本文链接:https://www.haomeiwen.com/subject/vbpntrtx.html