LangSmith 배포의 다양한 서비스들은 로그, 메트릭, trace 형태의 telemetry 데이터를 생성합니다. Kubernetes 클러스터에 이미 telemetry collector가 설정되어 있거나, 애플리케이션을 모니터링하기 위해 배포하고자 할 수 있습니다.
이 페이지는 LangSmith로부터 telemetry 데이터를 수집하기 위해 OTel Collector를 구성하는 방법을 설명합니다. 아래에서 논의되는 모든 개념은 Fluentd나 FluentBit와 같은 다른 collector로도 적용될 수 있습니다.
이 섹션은 Kubernetes 배포에만 적용됩니다.
Receivers
Logs
다음은 Sidecar collector가 자체 pod에서 로그를 읽되, 도메인 특정적이지 않은 컨테이너의 로그는 제외하는 예시입니다. 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
이 구성은 해당 namespace의 pod에 대한 ‘get’, ‘list’, ‘watch’ 권한이 필요합니다.
Metrics
Metrics는 Prometheus endpoint를 사용하여 수집할 수 있습니다. 단일 인스턴스 Gateway collector를 사용하면 메트릭을 가져올 때 쿼리 중복을 피할 수 있습니다. 다음 구성은 기본적으로 명명된 모든 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
이 구성은 해당 namespace의 pod, service, endpoint에 대한 ‘get’, ‘list’, ‘watch’ 권한이 필요합니다.
Traces
Trace의 경우, OTLP receiver를 활성화해야 합니다. 다음 구성을 사용하여 포트 4318에서 HTTP trace를, 포트 4317에서 GRPC를 수신할 수 있습니다:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
Processors
권장 OTEL Processors
OTel collector를 사용할 때 다음 processor들이 권장됩니다:
Exporters
Exporter는 원하는 외부 endpoint를 가리키기만 하면 됩니다. 다음 구성을 사용하면 로그, 메트릭, trace에 대해 별도의 endpoint를 구성할 수 있습니다:
otlphttp/logs:
endpoint: <your_logs_endpoint>
otlphttp/metrics:
endpoint: <your_metrics_endpoint>
otlphttp/traces:
endpoint: <your_traces_endpoint>
OTel Collector는 Datadog endpoint로 직접 내보내기도 지원합니다.
Example Collector Configuration: 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
Example Collector Configuration: 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]