Python

1) CRD 설치

인프라 - 커스텀 리소스 - 'instrumentations' 를 검색하여 생성할 수 있습니다.

생성 버튼을 클릭하고 로그를 수집할 네임스페이스를 선택하고 아래와 같은 양식을 수정하여 생성할 수 있습니다.

위 CRD는 네임스페이스 기준으로 적용되고 동일 네임스페이스에 다른 언어도 자동 컨테이너 로그를 수집할 수 있습니다.

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: {Instrumentation name}
spec:
  exporter:
    endpoint: http://cocktail-telemetry-collector.cocktail-addon:4318
  python:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-python:0.44b0
    env:
      - name: OTEL_LOGS_EXPORTER
        value: otlp_proto_http
      - name: OTEL_METRICS_EXPORTER
        value: none
      - name: OTEL_TRACES_EXPORTER
        value: none        
      - name: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT
        value: http://cocktail-telemetry-collector.cocktail-addon:4318/v1/logs
      - name: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED
        value: 'true'

     # 해당 네임스페이스의 anotation 값이 'true'인 모든 파이썬 어플리케이션을 수집하고싶을때 사용.
     # 아래 설정은 네임스페이스내 모든 Python 애플리케이션을 같은 이름으로 선언하는 경우 사용함.
     # 워크로드별 애플리케이션 이름을 다르게 사용하고자 하는 경우 각 애플리케이션 환경 변수에 설정.
      - name: OTEL_SERVICE_NAME
        value: {애플리케이션 이름}
      - name: OTEL_EXPORTER_OTLP_LOGS_HEADERS
        value: app_token={애플리케이션 토큰},app_name={애플리케이션 이름}

CRD를 통해 해당 네임스페이스에 있는 모든 애플리케이션이 아닌 개별 어플리케이션 마다 환경변수를 추가하면 특정 애플리케이션의 로그만 수집할 수 있습니다.

2) 수집하려는 애플리케이션에 어노테이션 추가

로그를 수집할 네임스페이스의 워크로드에 어노테이션을 추가합니다.

애플리케이션 - 서비스맵 - 로그를 수집할 서비스맵 - 워크로드 - 로그를 수집할 애플리케이션 선택 - "설정" 버튼을 클릭합니다.

Yaml 보기를 변경하여 template - metadata - annotaions 부분에 다음과 같은 어노테이션을 추가합니다.

instrumentation.opentelemetry.io/inject-python: 'true'

3) 서비스 이름과 토큰값을 환경변수에 추가.

apiVersion: apps/v1
kind: Deployment
...
spec:
...
  template:
    spec:
      containers:
      - env:

	# Application 이름
	- name: OTEL_SERVICE_NAME
          value: {애플리케이션 이름}
        
        # 인증을 위한 설정
        - name: OTEL_EXPORTER_OTLP_LOGS_HEADERS
          value: app_token={애플리케이션 토큰},app_name={애플리케이션 이름}     
        
        image: {python-application image}
        imagePullPolicy: Always
        ...

애플리케이션 로그에는 수집이 되고있지만 워크로드의 로그에 로그가 보이지 않는 경우

파이썬의 Logger 설정이 필요합니다.

아래 코드는 Flask의 예시입니다.

from flask import Flask
import logging

app = Flask(__name__)
logger = logging.getLogger(__name__)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 콘솔 핸들러
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
app.logger.addHandler(console_handler)
logger.setLevel(logging.DEBUG)

4. 애플리케이션 로그 확인

1) 로깅 - 애플리케이션 로그 - 애플리케이션 목록에서 설정한 애플리케이션 검색

Last updated