생성 버튼을 클릭하고 로그를 수집할 네임스페이스를 선택하고 아래와 같은 양식을 수정하여 생성할 수 있습니다.
위 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)
1) 로깅 - 애플리케이션 로그 - 애플리케이션 목록에서 설정한 애플리케이션 검색