파란하늘의 지식창고
article thumbnail
반응형

OpenTelemetry Collector extension 소개

opentelemetry-collector 를 사용하면서 다양한 extension을 추가하여 사용할 수 있다.

https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension

extension을 활성화하면 특정 주소로 해당 extension을 호출하여 사용하게 된다.

이 중 zpages , pprof , health_check extension를 사용해 보면서 기록을 남겨본다.

전체 설정 파일은 마지막 부분에 정리해 두었다.

K8S deployment, service 설정 부분

extension 사용 시 endpoint 기본 설정이 localhost:[해당 extension 포트] 로 지정되어 있다.
내 경우 k8s에 pod를 띄워 사용하고 있는데 pod ip를 따로 지정해야 했다.
opentelemetry-collecotor의 deployment 설정에 extension 관련 port와 env를 지정한다.
(extension을 추가할수록 해당 extension에 대한 port 설정도 필요시 추가된다.)

        ports: 
        - [...기존 설정 생략]
        - name: pprof # pprof extension
          containerPort: 1777
          protocol: TCP
        - name: healthcheck # healthcheck extension
          containerPort: 13133
          protocol: TCP
        - name: zpages # healthcheck extension
          containerPort: 55679
          protocol: TCP
        env:
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.podIP

이 ip값을 otel config 설정의 각 extension endpoint에 지정한다.

해당 port 설정을 service에도 추가한다.

  - [...기존 설정 생략]
  - name: ppro # pprof extension
    port: 1777
    protocol: TCP
  - name: healthcheck # healthcheck extension
    port: 13133
    protocol: TCP
  - name: zpages # zpages extension
    port: 55679
    protocol: TCP

otel config 설정

zpages extension 사용하기

https://github.com/open-telemetry/opentelemetry-collector/blob/main/extension/zpagesextension/README.md
zpages는 web에서 별다른 도구 없이 opentelemetry-collector application의 상태를 확인할 수 있는 웹페이지를 제공한다.

앞서 설명한 것처럼 deployment와 service에 env, port 관련 설정을 한 후 otel config 파일에 endpoint를 지정한다.

extensions:
  zpages:
    endpoint: ${env:MY_POD_IP}:55679
service:
  extensions: [zpages]

추가하면 다음 endpoint를 접근할 수 있다.

  • /debug/servicez
  • /debug/pipelinez
  • /debug/extensionz
  • /debug/featurez
  • /debug/tracez

servicez
pipelinez
extensionz
featurez
tracez

내 경우 tracez가 현재 서비스 중인 상황을 한눈에 파악하기 좋아 자주 보게 되었다.

pprof extension 사용하기

https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/extension/pprofextension/README.md

pprof는 Performance Profile (성능 프로파일)을 보여준다.

앞서 설명한 것처럼 deployment와 service에 env, port 관련 설정을 한 후 otel config 파일에 endpoint를 지정한다.

extensions:
  pprof:
    endpoint: ${env:MY_POD_IP}:1777
service:
  extensions: [pprof]

추가하면 다음 endpoint로 접근할 수 있다.

  • /debug/pprof

health_check extension 사용하기

https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/extension/healthcheckextension/README.md

health_check extension은 별다른 기능이 없고 단순하게 / 호출 시 간단한 서버 상태를 다음처럼 보여준다.

{
  "status": "Server available",
  "upSince": "2024-12-11T20:45:23.059041073Z",
  "uptime": "12.021395418s"
}

앞서 설명한 것처럼 deployment와 service에 env, port 관련 설정을 한 후 otel config 파일에 endpoint를 지정한다.

extensions:
  health_check:
    endpoint: ${env:MY_POD_IP}:13133
service:
  extensions: [health_check]

이 extension을 사용하면 k8s의 readinessProbe, livenessProbe를 설정할 수 있게 된다.

livenessProbe:
  httpGet:
    path: /
    port: 13133
readinessProbe:
  httpGet:
    path: /
    port: 13133

전체 k8s 파일

앞서 소개한 내용을 설정한 k8s 파일 전체 내용을 열거하면 다음과 같다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: opentelemetry-collector-configmap
data:
  opentelemetry-collector.yaml: |
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: ${env:MY_POD_IP}:4317
          http:
            endpoint: ${env:MY_POD_IP}:4318

    processors:
      batch:

    exporters:
      otlp:
        endpoint: tempo-service.opensource.svc.cluster.local:4317
        tls:
          insecure: true
      otlphttp:
        endpoint: http://loki-service.opensource.svc.cluster.local:3100/otlp
      debug:
        verbosity: normal

    extensions:
      health_check:
        endpoint: ${env:MY_POD_IP}:13133
      pprof:
        endpoint: ${env:MY_POD_IP}:1777
      zpages:
        endpoint: ${env:MY_POD_IP}:55679

    service:
      extensions: [health_check, pprof, zpages]
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch]
          exporters: [debug, otlp]
        logs:
          receivers: [otlp]
          processors: [batch]
          exporters: [debug, otlphttp]
---
apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: opentelemetry-collector-deployment 
  labels: 
    app: opentelemetry-collector
spec: 
  selector: 
    matchLabels: 
      app: opentelemetry-collector
  template: 
    metadata: 
      labels: 
        app: opentelemetry-collector
    spec: 
      containers: 
      - name: opentelemetry-collector
        image: otel/opentelemetry-collector:latest 
        command:
        - /otelcol
        - --config=/conf/opentelemetry-collector.yaml
        resources:
          limits:
            cpu: 1
            memory: 2Gi
          requests:
            cpu: 200m
            memory: 400Mi
        ports: 
        - name: jaeger-compact
          containerPort: 6831
          protocol: UDP
        - name: jaeger-grpc
          containerPort: 14250
          protocol: TCP
        - name: jaeger-thrift
          containerPort: 14268
          protocol: TCP
        - name: otlp
          containerPort: 4317
          protocol: TCP
        - name: otlp-http
          containerPort: 4318
          protocol: TCP
        - name: zipkin
          containerPort: 9411
          protocol: TCP
        - name: pprof # pprof extension
          containerPort: 1777
          protocol: TCP
        - name: healthcheck # healthcheck extension
          containerPort: 13133
          protocol: TCP
        - name: zpages # healthcheck extension
          containerPort: 55679
          protocol: TCP
        env:
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.podIP
        livenessProbe:
          httpGet:
            path: /
            port: 13133
        readinessProbe:
          httpGet:
            path: /
            port: 13133
        volumeMounts: 
        - name: opentelemetry-collector-config
          mountPath: /conf
      volumes:
      - name: opentelemetry-collector-config
        configMap:
          name: opentelemetry-collector-configmap
          items:
          - key: opentelemetry-collector.yaml
            path: opentelemetry-collector.yaml
---
apiVersion: v1 
kind: Service 
metadata: 
  name: opentelemetry-collector-service 
  labels: 
    app: opentelemetry-collector
spec: 
  selector: 
    app: opentelemetry-collector
  ports: 
  - name: otlp-grpc # Default endpoint for OpenTelemetry gRPC receiver.
    port: 4317
    targetPort: 4317
    protocol: TCP
    appProtocol: grpc
  - name: otlp-http # Default endpoint for OpenTelemetry HTTP receiver.
    port: 4318
    targetPort: 4318
    protocol: TCP
  - name: ppro # pprof extension
    port: 1777
    protocol: TCP
  - name: healthcheck # healthcheck extension
    port: 13133
    protocol: TCP
  - name: zpages # zpages extension
    port: 55679
    protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: opentelemetry-collector-ingress
spec:
  rules:
  - host: opentelemetry-collector.bluesky.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: opentelemetry-collector-service
            port:
              number: 13133
      - path: /v1
        pathType: Prefix
        backend:
          service:
            name: opentelemetry-collector-service
            port:
              number: 4318
      - path: /debug
        pathType: Prefix
        backend:
          service:
            name: opentelemetry-collector-service
            port:
              number: 55679
      - path: /debug/pprof
        pathType: Prefix
        backend:
          service:
            name: opentelemetry-collector-service
            port:
              number: 1777

내 경우 ingress로 호출해서 관련 설정도 추가하였다.

rules:
- host: opentelemetry-collector.bluesky.local
  http:
    paths:
    - path: /v1
      pathType: Prefix
      backend:
        service:
          name: opentelemetry-collector-service
          port:
            number: 4318
    - path: /debug
      pathType: Prefix
      backend:
        service:
          name: opentelemetry-collector-service
          port:
            number: 55679
반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요