LangSmith 텔레메트리용 컬렉터 구성하기

LangSmith 텔레메트리용 컬렉터 구성하기

LangSmith 배포의 다양한 서비스는 로그, 메트릭, 트레이스 형태의 텔레메트리 데이터를 내보냅니다. Kubernetes 클러스터에 이미 텔레메트리 컬렉터가 설정되어 있을 수도 있고, 애플리케이션을 모니터링하기 위해 새로 배포하고 싶을 수도 있습니다.

이 페이지에서는 LangSmith에서 텔레메트리 데이터를 수집하도록 OTel Collector를 구성하는 방법을 설명합니다. 아래에서 다루는 모든 개념은 FluentdFluentBit 같은 다른 컬렉터로도 옮길 수 있습니다.

경고: 이 섹션은 Kubernetes 배포에만 적용됩니다.

출처: 문서

본문

Receivers

로그

다음은 도메인별이 아닌 컨테이너의 로그를 제외하고 자체 pod에서 로그를 읽기 위한 Sidecar 컬렉터 예제입니다. 모든 컨테이너의 파일시스템에 접근해야 하므로 Sidecar 구성이 여기서 유용합니다. DaemonSet도 사용할 수 있습니다.

filelog:
  exclude:
    - "**/otc-container/*.log"
  include:
    - /var/log/pods/${POD_NAMESPACE}_${POD_NAME}_${POD_UID}/*/*.log
  include_file_name: false
  include_file_path: true
  operators:
    - id: container-parser
      type: container
  retry_on_failure:
    enabled: true
  start_at: end
env:
  - name: POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  - name: POD_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
  - name: POD_UID
    valueFrom:
      fieldRef:
        fieldPath: metadata.uid
volumes:
  - name: varlogpods
    hostPath:
      path: /var/log/pods
volumeMounts:
  - name: varlogpods
    mountPath: /var/log/pods
    readOnly: true

정보: 이 구성은 해당 네임스페이스의 pods에 대한 'get', 'list', 'watch' 권한이 필요합니다.

메트릭

메트릭은 Prometheus 엔드포인트를 통해 스크랩할 수 있습니다. 메트릭을 가져올 때 쿼리 중복을 피하려면 단일 인스턴스 Gateway 컬렉터를 사용할 수 있습니다. 다음 구성은 기본 명명된 LangSmith 서비스 전부를 스크랩합니다:

prometheus:
  config:
    scrape_configs:
      - job_name: langsmith-services
        metrics_path: /metrics
        scrape_interval: 15s
        # Only scrape endpoints in the LangSmith namespace
        kubernetes_sd_configs:
          - role: endpoints
            namespaces:
              names: [<langsmith-namespace>]
        relabel_configs:
          # Only scrape services with the name langsmith-.*
          - source_labels: [__meta_kubernetes_service_name]
            regex: "langsmith-.*"
            action: keep
          # Only scrape ports with the following names
          - source_labels: [__meta_kubernetes_endpoint_port_name]
            regex: "(backend|platform|playground|redis-metrics|postgres-metrics|metrics)"
            action: keep
          # Promote useful metadata into regular labels
          - source_labels: [__meta_kubernetes_service_name]
            target_label: k8s_service
          - source_labels: [__meta_kubernetes_pod_name]
            target_label: k8s_pod
          # Replace the default "host:port" as Prom's instance label
          - source_labels: [__address__]
            target_label: instance

정보: 이 구성은 해당 네임스페이스의 pods, services, endpoints에 대한 'get', 'list', 'watch' 권한이 필요합니다.

트레이스

트레이스의 경우 OTLP receiver를 활성화해야 합니다. 다음 구성은 포트 4318에서 HTTP 트레이스를, 포트 4317에서 GRPC를 수신하는 데 사용할 수 있습니다:

otlp:
  protocols:
    grpc:
      endpoint: 0.0.0.0:4317
    http:
      endpoint: 0.0.0.0:4318

Processors

권장 OTEL 프로세서

OTel 컬렉터에서 다음 프로세서를 권장합니다:

  • Batch Processor: 내보내기 전에 데이터를 배치로 그룹화합니다.
  • Memory Limiter: 컬렉터가 너무 많은 메모리를 사용해 충돌하는 것을 방지합니다. 소프트 한도를 넘으면 컬렉터는 새 데이터 수락을 중단합니다.
  • Kubernetes Attributes Processor: pod 이름 같은 Kubernetes 메타데이터를 텔레메트리 데이터에 추가합니다.

Exporters

Exporters는 원하는 외부 엔드포인트를 가리키기만 하면 됩니다. 다음 구성은 로그, 메트릭, 트레이스용 별도 엔드포인트를 구성할 수 있게 합니다:

otlphttp/logs:
  endpoint: <your_logs_endpoint>
otlphttp/metrics:
  endpoint: <your_metrics_endpoint>
otlphttp/traces:
  endpoint: <your_traces_endpoint>

참고: OTel Collector는 Datadog 엔드포인트로 직접 내보내기도 지원합니다.

예제 컬렉터 구성: Logs sidecar

mode: sidecar
image: otel/opentelemetry-collector-contrib
config:
  receivers:
    filelog:
      exclude:
        - "**/otc-container/*.log"
      include:
        - /var/log/pods/${POD_NAMESPACE}_${POD_NAME}_${POD_UID}/*/*.log
      include_file_name: false
      include_file_path: true
      operators:
        - id: container-parser
          type: container
      retry_on_failure:
        enabled: true
      start_at: end
  processors:
    batch:
      send_batch_size: 8192
      timeout: 10s
    memory_limiter:
      check_interval: 1m
      limit_percentage: 90
      spike_limit_percentage: 80
  exporters:
    otlphttp/logs:
      endpoint: <your-endpoint>
  service:
    pipelines:
      logs/langsmith:
        receivers: [filelog]
        processors: [batch, memory_limiter]
        exporters: [otlphttp/logs]
env:
  - name: POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  - name: POD_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
  - name: POD_UID
    valueFrom:
      fieldRef:
        fieldPath: metadata.uid
volumes:
  - name: varlogpods
    hostPath:
      path: /var/log/pods
volumeMounts:
  - name: varlogpods
    mountPath: /var/log/pods
    readOnly: true

예제 컬렉터 구성: Metrics and traces Gateway

mode: deployment
image: otel/opentelemetry-collector-contrib
config:
  receivers:
    prometheus:
      config:
        scrape_configs:
          - job_name: langsmith-services
            metrics_path: /metrics
            scrape_interval: 15s
            # Only scrape endpoints in the LangSmith namespace
            kubernetes_sd_configs:
              - role: endpoints
                namespaces:
                  names: [<langsmith-namespace>]
            relabel_configs:
              # Only scrape services with the name langsmith-.*
              - source_labels: [__meta_kubernetes_service_name]
                regex: "langsmith-.*"
                action: keep
              # Only scrape ports with the following names
              - source_labels: [__meta_kubernetes_endpoint_port_name]
                regex: "(backend|platform|playground|redis-metrics|postgres-metrics|metrics)"
                action: keep
              # Promote useful metadata into regular labels
              - source_labels: [__meta_kubernetes_service_name]
                target_label: k8s_service
              - source_labels: [__meta_kubernetes_pod_name]
                target_label: k8s_pod
              # Replace the default "host:port" as Prom's instance label
              - source_labels: [__address__]
                target_label: instance
    otlp:
      protocols:
        grpc:
          endpoint: 0.0.0.0:4317
        http:
          endpoint: 0.0.0.0:4318
  processors:
    batch:
      send_batch_size: 8192
      timeout: 10s
    memory_limiter:
      check_interval: 1m
      limit_percentage: 90
      spike_limit_percentage: 80
  exporters:
    otlphttp/metrics:
      endpoint: <metrics_endpoint>
    otlphttp/traces:
      endpoint: <traces_endpoint>
  service:
    pipelines:
      metrics/langsmith:
        receivers: [prometheus]
        processors: [batch, memory_limiter]
        exporters: [otlphttp/metrics]
      traces/langsmith:
        receivers: [otlp]
        processors: [batch, memory_limiter]
        exporters: [otlphttp/traces]

더 알아보기