Opentelemetry

  • Published on
    OpenTelemetry Collector를 사용할 때, 다양한 exporter를 통해서 Telemetry data를 저장할 수 있다. GCP를 사용하는 경우에는 Google Cloud Exporter를 사용해서 Telemetry data를 쉽게 저장할 수 있다. 그런데 Log의 경우에는 내가 설정한 Resource attribute가 기대한 것처럼 Google Cloud Logging의 Label에 등록되지 않는 경우를 경험할 수도 있다. 따라서 오늘은 Google Cloud Exporter를 사용할 때, Resource Attribute들이 Cloud Logging Label로 어떻게 변환되는지 자세히 설명한다.
  • Published on
    OpenTelemetry Operator로 Auto-Instrumentation을 주입할 수 있다. 그런데 환경변수 설정을 올바르게 하지 않거나 OpenTelemetry Collector에서 proccessor 설정을 제대로 해주지 않으면, Resource attribute중 k8s.namespace.name가 빈문자열로 보내질 수 있다. 이러한 경우에 Auto-Instrumentation에서 Resource attribute가 어떻게 자동으로 설정되는지 resourceDetector들을 이해하면 쉽게 해결할 수 있다. 따라서 이번 글에서는 Resource Detector들에 대해서 자세히 살펴본다.
  • Published on
    Opentelemetry Instrumentation 라이브러리 중에서 Str(), Empty()로 attribute value를 설정하여 Metric을 보내는 경우가 있었다. 문제는 Thanos Receiver를 통해서 Metric을 저장하려고 할 때, Attribute value 값이 빈문자열이면 에러가 발생하였다. Otel 1.38.0 규격 문서를 확인했을 때 Attribute value는 빈문자열도 의미를 가질 수 있고 정상적으로 저장되어야 하는 것으로 정의되어 있었다. 따라서 Attribute value가 빈문자열이 때도 정상적으로 저장될 수 있도록 Thanos 소스코드를 수정하여 Container Image 빌드하여 사용하였다.
  • Published on
    소스코드를 변경하지 않고 opentelemetry-operator의 Instrumentation CRD를 통해서 Python Application을 자동으로 Instrumentation을 해봤다. 이 과정에서 OpenTelemetry Logging의 경우에는 기존 Logging Libarary에 Bridge API로 연동하는 구조로 설계된 것을 알게 되었고, Python opentelemetry sdk가 logger에 handler를 추가하는 것을 알게 되었다. 또한 sitecustomize.py을 통해서 Python Application이 실행되기 전에 Instrumentation library를 셋팅하는 것을 이해하게 되었다. Gunicorn으로 Flask를 실행할 때와 Uvicorn으로 FastAPI를 실행할 때, Auto Instrumentation이 잘 되는 것을 확인하였다.
  • Published on
    Ubuntu 20.04 서버의 auth.log, syslog 로그 값들을 OpenTelemetry를 통해서 수집하고 싶었다. 처음에는 Filelog Receiver를 통해서 수집하려고 하였고, rsyslog의 설정값을 변경하여 Filelog로 수집하도록 구성했다. 그런데 이후에 Syslog Receiver가 존재하는 것을 확인하게 되었고, 훨씬 간단하게 syslog를 수집할 수 있었다.
  • Published on
    OpenTelemetry collector를 사용하여 tracing과 logging을 같이 하는 것을 검토하였다. Kubernetes와 멀어져 있던 사이에 OpenTelemetry 커뮤니티가 엄청나게 성장한 것을 깨닫게 되었다. Log에 traceID를 남기고 그걸로 Tracing 정보를 볼 수 있도록 구성했고, Grafana 하나에서 통합적으로 볼 수 있도록 Loki와 Tempo를 Exporter로 사용했다. 아직 Python과 Nodejs에서는 Log쪽의 상태는 Development나 Experimental이기 때문에, receiver에서 filelog를 사용하여 Kubernetes log file을 fluentbit처럼 tail해서 가져오고 traceId를 log에 넣어주는 instrument libary를 사용했다.