콘텐츠로 이동

Dataway


简介

DataWay는 Guance의 데이터 게이트웨이입니다. 수집기가 Guance에 데이터를 보고하려면 반드시 DataWay 게이트웨이를 거쳐야 합니다.

Dataway 설치

  • Dataway 생성

Guance 관리 백엔드의 '데이터 게이트웨이' 페이지에서 'Dataway 생성'을 클릭합니다. 이름과 바인딩 주소를 입력한 후 '생성'을 클릭합니다.

생성에 성공하면 자동으로 새 Dataway가 생성되고 Dataway 설치 스크립트가 생성됩니다.

Info

바인딩 주소는 Dataway 게이트웨이 주소입니다. 반드시 http(s)://1.2.3.4:9528과 같은 완전한 HTTP 주소를 입력해야 하며, 프로토콜, 호스트 주소 및 포트를 포함해야 합니다. 호스트 주소는 일반적으로 Dataway를 배포하는 머신의 IP 주소를 사용할 수 있으며, 도메인 이름으로 지정할 수도 있습니다. 도메인 이름은 해석이 설정되어 있어야 합니다.

참고: 수집기가 해당 주소에 액세스할 수 있는지 확인해야 합니다. 그렇지 않으면 데이터 수집이 실패합니다.

  • Dataway 설치
DW_KODO=http://kodo_ip:port \
   DW_TOKEN=<tkn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX> \
   DW_UUID=<YOUR_UUID> \
   bash -c "$(curl https://static.guance.com/dataway/install.sh)"

호스트 설치는 더 이상 권장되지 않습니다. Kubernetes statefulset 방식으로 Dataway를 설치하세요.

설치가 완료되면 설치 디렉터리에 dataway.yaml이 생성됩니다. 내용 예시는 아래와 같으며, 수동으로 수정한 후 서비스를 재시작하여 적용할 수 있습니다.

dataway.yaml (클릭하여 펼치기)
# ============= DATAWAY CONFIG =============

# Dataway UUID, we can get it on during create a new dataway
uuid:

# It's the workspace token, most of the time, it's
# system worker space's token.
token:

# secret_token used under sinker mode, and to check if incomming datakit
# requests are valid.
secret_token:

# If __internal__ token allowed? If ok, the data/request will direct to
# the workspace with the token above
enable_internal_token: false

# is empty token allowed? If ok, the data/request will direct to
# the workspace with the token above
enable_empty_token: false

# Is dataway cascaded? For cascaded Dataway, it's remote_host is
# another Dataway and not Kodo.
cascaded: false

# kodo(next dataway) related configures
remote_host:
http_timeout: 3s

http_max_idle_conn_perhost: 0 # default to CPU cores
http_max_conn_perhost: 0      # default no limit
kodo_queue:
  enabled: true
  workers: 256
  queue_size: 1024
  queue_max_bytes: 1073741824 # 1GB
  enqueue_timeout: 100ms

insecure_skip_verify: false
http_client_trace: false
sni: ""

# dataway API configures
# IPv4 和 IPv6 使用独立 listener,避免依赖操作系统的 bindv6only 行为
bind: 0.0.0.0:9528
# IPv6 默认关闭,需要时显式设置为 "[::]:9528"
bind_ipv6: ""

# 仅来自可信代理的请求才会使用转发头进行 IP 白名单判断
# trusted_proxies:
#   - 10.0.0.0/8
#   - 2001:db8:ffff::/48

# disable 404 page
disable_404page: false

# dataway TLS file path
tls_crt:
tls_key:

# pprof 默认关闭;仅允许配置 loopback 监听地址
pprof_bind: ""

api_limit_rate : 100000         # 100K
max_http_body_bytes : 67108864  # 64MB
copy_buffer_drop_size : 262144  # 256KB, if copy buffer memory larger than this, this memory released
reserved_pool_size: 4096        # reserved pool size for better GC

within_docker: false

log_level: info
log: log
gin_log: gin.log

ip_black_list:
  ttl: "1m"
  clean_interval: "1h"

cache_cfg:
  # cache disk path
  dir: "disk_cache"

  # disable cache
  disabled: false

  clean_interval: "1s"

  # in MB, max single data package size in disk cache, such as HTTP body
  max_data_size: 100

  # in MB, single disk-batch(single file) size
  batch_size: 128

  # in MB, max disk size allowed to cache data
  max_disk_size: 65535

  # expire duration, default 7 days
  expire_duration: "168h"

prometheus:
  listen: "localhost:9090"
  url: "/metrics"
  enable: true

#sinker:
#  cache_options:
#    prealloc: true
#    reserved_capacity: 10000000 # max cached items
#    buckets: 64
#    ttl: 10m # clear unactive matches
#  etcd:
#    urls:
#    - http://localhost:2379 # one or multiple etcd host
#    dial_timeout: 30s
#    key_space: "/dw_sinker" # subscribe to the etcd key
#    username: "dataway"
#    password: "<PASSWORD>"
#  file:
#    path: /path/to/sinker.json

Dataway pod yaml은 다음과 같습니다:

dataway-statefulset.yaml (클릭하여 펼치기)
---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: sts-utils-dataway
  name: dataway
  namespace: utils
spec:
  replicas: 2
  selector:
    matchLabels:
      app: sts-utils-dataway
  serviceName: dataway
  template:
    metadata:
      annotations:
        datakit/logs: |
          [
            {
              "disable": false,
              "source": "dataway",
              "service": "dataway",
              "multiline_match": "^\\d{4}|^\\[GIN\\]"
            }
          ]
        datakit/prom.instances: |
          [[inputs.prom]]
            url = "http://$IP:9090/metrics"

            source = "dataway"
            measurement_name = "dw"
            interval = "10s"
            disable_instance_tag = true
          [inputs.prom.tags]
            service = "dataway"
            instance = "$PODNAME" # we can set as "xxx-$PODNAME"
      labels:
        app: sts-utils-dataway
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - sts-utils-dataway
              topologyKey: kubernetes.io/hostname
      containers:
        - env:
            - name: DW_REMOTE_HOST
              value: http://kodo.forethought-kodo:9527
            - name: DW_BIND
              value: 0.0.0.0:9528
            # 如需监听 IPv6,取消下面两行的注释
            # - name: DW_BIND_IPV6
            #   value: "[::]:9528"
            - name: DW_UUID
              value: agnt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx   # Dataway UUID
            - name: DW_TOKEN
              value: tkn_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  # Dataway token
            - name: DW_PROM_LISTEN
              value: 0.0.0.0:9090
            - name: DW_LOG
              value: stdout
            - name: DW_LOG_LEVEL
              value: info
            - name: DW_GIN_LOG
              value: stdout
            - name: DW_DISKCACHE_DIR
              value: cache
            - name: DW_HTTP_TIMEOUT
              value: '3s'
            - name: DW_ENABLE_INTERNAL_TOKEN
              value: 'false'
            - name: DW_MAX_HTTP_BODY_BYTES
              value: '67108864'
            - name: DW_HTTP_CLIENT_TRACE
              value: 'on'
            - name: DW_RESERVED_POOL_SIZE
              value: '0'
            - name: DW_COPY_BUFFER_DROP_SIZE
              value: '262144'
            - name: DW_DISKCACHE_CAPACITY_MB
              value: 102400
          image: pubrepo.guance.com/dataflux/dataway:1.18.0
          imagePullPolicy: IfNotPresent
          name: dataway
          ports:
            - containerPort: 9528
              name: 9528tcp01
              protocol: TCP
          resources:
            limits:
              cpu: '4'
              memory: 4Gi
            requests:
              cpu: 100m
              memory: 512Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /usr/local/cloudcare/dataflux/dataway/cache
              name: dataway-cache
      dnsPolicy: ClusterFirst
      imagePullSecrets: []
      #nodeSelector:
      #  nodepool: dataway
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      #tolerations:
      #  - effect: NoSchedule
      #    key: nodepool
      #    operator: Equal
      #    value: dataway
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
  volumeClaimTemplates:
    - apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: dataway-cache
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 100Gi
        storageClassName: xxxxxx  # High-Performance Storage StorageClass
        volumeMode: Filesystem
      status:
        phase: Pending

---

apiVersion: v1
kind: Service
metadata:
  name: dataway
  namespace: utils
spec:
  ipFamilyPolicy: SingleStack # 双栈模式改为 PreferDualStack
  # ipFamilies:
  #   - IPv4
  #   - IPv6
  ports:
    - name: 9528tcp02
      nodePort: 30928
      port: 9528
      protocol: TCP
      targetPort: 9528
  selector:
    app: sts-utils-dataway
  type: NodePort

기본 예시는 IPv4 단일 스택을 사용합니다. 듀얼 스택을 활성화하려면 Kubernetes 클러스터와 CNI가 IPv4/IPv6 듀얼 스택을 지원하는지 확인한 후 다음 구성을 모두 수정하세요:

  1. Dataway 컨테이너 환경 변수에서 DW_BIND_IPV6의 주석을 해제하고 [::]:9528로 설정하여 Dataway가 IPv4와 IPv6를 모두 수신하도록 합니다.
  2. Service의 ipFamilyPolicySingleStack에서 PreferDualStack으로 변경하고 ipFamilies 아래 IPv4, IPv6의 주석을 해제합니다.

이 두 항목은 반드시 함께 활성화해야 합니다. Service만 수정하고 DW_BIND_IPV6를 설정하지 않으면 Dataway가 IPv6 요청을 수신하지 않습니다.

dataway-statefulset.yaml에서는 환경 변수를 통해 Dataway 구성을 수정할 수 있습니다. 자세한 내용은 여기를 참조하세요.

ConfigMap을 통해 dataway.yaml을 외부에 마운트할 수도 있지만, 반드시 /usr/local/cloudcare/dataflux/dataway/dataway.yaml에 마운트해야 합니다:

containers:
  volumeMounts:
    - name: dataway-config
      mountPath: /usr/local/cloudcare/dataflux/dataway/dataway.yaml
      subPath: config.yaml
volumes:
- configMap:
    defaultMode: 256
    name: dataway-config
    optional: false
  name: dataway-config

컨테이너 설치에 필요한 환경 변수는 Kubernetes와 동일합니다. 다음 Docker 명령을 사용하여 DataWay 컨테이너를 시작할 수 있습니다:

docker run -d \
    --name <YOUR-DW-IN-DOCKER> \
    -p 19528:9528 -p 19090:9090 \
    --mount type=bind,source=<host/path/for/diskcache>,target=/usr/local/cloudcare/dataflux/dataway/cache \
    --memory=2g --memory-reservation=256m \
    --cpus="2" \
    -e DW_UUID=<YOUR-AGNT_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX> \
    -e DW_TOKEN=<YOUR-TKN_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX> \
    -e DW_REMOTE_HOST=http://kodo.forethought-kodo:9527 \
    -e DW_BIND=0.0.0.0:9528 \
    -e DW_PROM_LISTEN=0.0.0.0:9090 \
    -e DW_HTTP_CLIENT_TRACE=true \
    -e DW_LOG_LEVEL=info \
    -e DW_LOG=stdout \
    -e DW_GIN_LOG=stdout \
    -e DW_DISKCACHE_CAPACITY_MB=65536 \
    pubrepo.guance.com/dataflux/dataway:1.18.0

참고 사항
  • Dataway는 Linux 시스템에서만 실행할 수 있습니다 (현재 Linux arm64/amd64 바이너리만 배포됨).
  • 호스트 설치 시 Dataway 설치 경로는 /usr/local/cloudcare/dataflux/dataway입니다.
  • Kubernetes에서 기본적으로 4000m/4Gi의 리소스 제한이 설정되어 있으며, 실제 상황에 따라 조정할 수 있습니다. 최소 요구 사항은 100m/512Mi입니다.
  • Dataway 설치 확인

설치가 완료되면 잠시 기다린 후 '데이터 게이트웨이' 페이지를 새로고침합니다. 방금 추가한 데이터 게이트웨이의 '버전 정보' 열에 버전 번호가 표시되면 이 Dataway가 Guance 중앙에 성공적으로 연결되었음을 의미하며, 프런트엔드 사용자는 이를 통해 데이터를 수집할 수 있습니다.

Dataway가 Guance 중앙에 성공적으로 연결되면 Guance 콘솔에 로그인하여 '통합'/'DataKit' 페이지에서 모든 Dataway 주소를 확인할 수 있습니다. 필요한 Dataway 게이트웨이 주소를 선택하고 DataKit 설치 명령을 서버에서 실행하여 데이터 수집을 시작할 수 있습니다.

DataWay 관리

DataWay 삭제

Guance 관리 백엔드의 '데이터 게이트웨이' 페이지에서 삭제할 DataWay를 선택하고 '구성'을 클릭한 후, 나타나는 DataWay 편집 대화상자에서 왼쪽 하단의 '삭제' 버튼을 클릭하면 됩니다.

Warning

DataWay를 삭제한 후에는 DataWay 게이트웨이를 배포한 서버에 로그인하여 DataWay 실행을 중지하고 설치 디렉터리를 삭제해야 DataWay가 완전히 제거됩니다.

DataWay 업그레이드

Guance 관리 백엔드의 '데이터 게이트웨이' 페이지에서 DataWay에 업그레이드 가능한 버전이 있는 경우 버전 정보에 업그레이드 알림이 표시됩니다.

DW_UPGRADE=1 bash -c "$(curl https://static.guance.com/dataway/install.sh)"

이미지 버전을 직접 교체하면 됩니다:

- image: pubrepo.guance.com/dataflux/dataway:1.18.0

Dataway 서비스 관리

호스트에 Dataway를 설치한 경우 다음 명령을 사용하여 Dataway 서비스를 관리할 수 있습니다.

# 시작
$ systemctl start dataway

# 재시작
$ systemctl restart dataway

# 중지
$ systemctl stop dataway

Kubernetes에서는 해당 Pod를 재시작하면 됩니다.

환경 변수

이미지 환경 변수

Dataway가 Kubernetes 환경에서 실행될 때 다음 환경 변수를 지원합니다.

기존 dataway.yaml 호환성

일부 예전 Dataway는 ConfigMap을 통해 구성을 주입했습니다 (컨테이너에 마운트된 파일 이름은 일반적으로 dataway.yaml입니다). Dataway 이미지가 시작된 후 설치 디렉터리에 ConfigMap에서 마운트된 파일이 있으면 아래 DW_* 환경 변수가 적용되지 않습니다. 기존 ConfigMap 마운트를 제거한 후에야 이러한 환경 변수가 적용됩니다.

환경 변수가 적용되면 Dataway 설치 디렉터리에 숨겨진 ( ls -a로 확인) .dataway.yaml 파일이 생성됩니다. 이 파일을 cat하여 환경 변수 적용 상태를 확인할 수 있습니다.

HTTP Server 설정

Env 설명
DW_REMOTE_HOST
type: string
required: Y
Kodo 주소 또는 다음 Dataway 주소, 형식: http://host:port
DW_WHITE_LIST
type: string
required: N
Dataway 클라이언트 IP 화이트리스트, 쉼표(,)로 구분
DW_TRUSTED_PROXIES
type: string
required: N
신뢰할 수 있는 프록시 IP/CIDR, 쉼표(,)로 구분. 신뢰할 수 있는 프록시의 요청만 X-Forwarded-For 또는 X-Real-IP를 사용하여 화이트리스트를 판단합니다.
DW_HTTP_TIMEOUT
type: string
required: N
Dataway가 Kodo 또는 다음 Dataway를 요청하는 시간 초과 설정, 기본값 3s
DW_HTTP_MAX_IDLE_CONN_PERHOST
type: int
required: N
Dataway가 Kodo를 요청할 때 최대 idle connection 설정 Version-1.6.2
기본값 1000 Version-1.11.2
DW_HTTP_MAX_CONN_PERHOST
type: int
required: N
Dataway가 Kodo를 요청할 때 최대 연결 수 설정, 기본값 제한 없음 Version-1.6.2
DW_KODO_QUEUE_ENABLED
type: boolean
required: N
쓰기/업로드/OTLP HTTP 요청을 Kodo 또는 다음 Dataway로 보내기 전에 유계 발송 큐를 활성화합니다. 기본값 true
DW_KODO_QUEUE_WORKERS
type: int
required: N
Kodo 발송 큐 worker 수, 기본값 256
DW_KODO_QUEUE_SIZE
type: int
required: N
Kodo 발송 큐에서 최대 대기 요청 수, 기본값 1024
DW_KODO_QUEUE_MAX_BYTES
type: int/string
required: N
Kodo 큐에서 대기 중, 전송 중 및 대기열 진입을 기다리는 요청의 body 총 바이트 상한. 1073741824, 1GB, 1024MB 등 형식 지원, 기본값 1GB
DW_KODO_QUEUE_ENQUEUE_TIMEOUT
type: string
required: N
요청이 Kodo 큐 빈 자리를 기다리는 최대 시간. 시간 초과 시 캐시 가능한 요청은 Dataway 캐시에 기록됩니다. 캐시를 사용할 수 없으면 503을 반환합니다. 기본값 100ms
DW_TOKEN_NEGATIVE_CACHE_ENABLED
type: boolean
required: N
유효하지 않은 토큰에 대한 부정 캐시를 활성화할지 여부. 캐시는 token, 쓰기 API 경로 및 main/headless 모드별로 분리됩니다. 기본값 true
DW_TOKEN_NEGATIVE_CACHE_TTL
type: string
required: N
유효하지 않은 토큰의 부정 캐시 유지 시간, 기본값 5m
DW_TOKEN_NEGATIVE_CACHE_MAX_KEYS
type: int
required: N
유효하지 않은 토큰의 부정 캐시가 보관하는 최대 scope key 수, 기본값 1000
DW_BIND
type: string
required: N
Dataway HTTP API IPv4 바인딩 주소, 기본값 0.0.0.0:9528
DW_BIND_IPV6
type: string
required: N
Dataway HTTP API IPv6 바인딩 주소, 기본적으로 수신하지 않음. [::]:9528로 설정하면 IPv6 수신을 명시적으로 활성화합니다.
DW_API_LIMIT
type: int
required: N
Dataway API 속도 제한 설정. 예를 들어 1000으로 설정하면 각 API는 1초에 1000번만 요청할 수 있습니다. 기본값 100K
DW_HEARTBEAT
type: string
required: N
Dataway와 중앙 간의 하트비트 간격, 기본값 60s
DW_MAX_HTTP_BODY_BYTES
type: int
required: N
Dataway API가 허용하는 최대 HTTP Body (바이트 단위), 기본값 64MB
DW_TLS_INSECURE_SKIP_VERIFY
type: boolean
required: N
HTTPS/TLS 인증서 오류 무시
DW_HTTP_CLIENT_TRACE
type: boolean
required: N
Dataway 자체가 HTTP 클라이언트로 작동할 때 관련 메트릭을 수집할 수 있습니다. 이 메트릭은 최종적으로 Prometheus 메트릭에 출력됩니다.
DW_ENABLE_TLS
type: boolean
required: N
HTTPS 활성화 Version-1.4.1
DW_TLS_CRT
type: file-path
required: N
HTTPS/TLS crt 파일 디렉터리 지정 Version-1.4.0
DW_TLS_KEY
type: file-path
required: N
HTTPS/TLS key 파일 디렉터리 지정 Version-1.4.0
DW_SNI
type: string
required: N
현재 Dataway SNI 정보 지정 Version-1.6.0
DW_DISABLE_404PAGE
type: boolean
required: N
404 페이지 비활성화 Version-1.6.1
DW_HTTP_IP_BLACKLIST_TTL
type: string
required: N
IP 블랙리스트 유효 시간 설정, 기본값 1m Version-1.11.0
DW_HTTP_IP_BLACKLIST_CLEAN_INTERVAL
type: string
required: N
IP 블랙리스트 정리 간격 설정, 기본값 1h Version-1.11.0
HTTP TLS 설정

1년 동안 유효한 TLS 인증서를 생성하려면 다음 OpenSSL 명령을 사용할 수 있습니다:

# 1년 유효기간의 TLS 인증서 생성
$ openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out tls.crt -keyout tls.key
...

명령을 실행하면 국가, 지역, 도시, 조직 이름, 부서 이름 및 이메일 주소를 포함한 몇 가지 필수 정보를 입력하라는 메시지가 표시됩니다. 이 정보는 인증서에 포함됩니다.

정보 입력을 완료하면 tls.crt (인증서 파일) 및 tls.key (개인 키 파일) 두 개의 파일이 생성됩니다. 개인 키 파일은 안전하게 보관하세요.

애플리케이션에서 이러한 TLS 인증서를 사용하려면 두 파일의 절대 경로를 애플리케이션의 환경 변수에 설정해야 합니다. 환경 변수 설정 예시는 다음과 같습니다:

먼저 DW_ENABLE_TLS를 활성화해야 다른 두 ENV (DW_TLS_CRT/DW_TLS_KEY)가 적용됩니다. Version-1.4.1

env:
- name: DW_ENABLE_TLS
  value: "true"
- name: DW_TLS_CRT
  value: "/path/to/your/tls.crt"
- name: DW_TLS_KEY
  value: "/path/to/your/tls.key"

/path/to/your/tls.crt/path/to/your/tls.key를 실제 tls.crttls.key 파일이 있는 경로로 바꾸세요.

설정이 완료되면 다음 명령으로 TLS가 적용되었는지 테스트할 수 있습니다:

$ curl -k http://localhost:9528

성공하면 It's working!이라는 ASCII Art 메시지가 표시됩니다. 인증서가 없으면 Dataway 로그에 다음과 유사한 오류가 표시됩니다:

server listen(TLS) failed: open /path/to/your/tls.{crt,key}: no such file or directory

이 경우 Dataway가 시작되지 않으며 위의 curl 명령도 오류를 반환합니다:

$ curl -vvv -k http://localhost:9528
curl: (7) Failed to connect to localhost port 9528 after 6 ms: Couldn't connect to server

로그 설정

Env 설명
DW_LOG
type: string
required: N
로그 경로, 기본값은 log입니다. 로그를 표준 출력으로 출력하여 로그 수집을 용이하게 하려면 stdout으로 설정하면 됩니다.
DW_LOG_LEVEL
type: string
required: N
기본값은 info이며, debug도 선택 가능합니다.
DW_GIN_LOG
type: string
required: N
기본값은 gin.log이며, 여기서도 stdout으로 설정하여 수집을 용이하게 할 수 있습니다.
DW_LOG_PKG_ID
type: bool
required: N
Version-1.12.0 로그에 패키지 ID를 기록할지 여부. 기본값 true.

Token/UUID 설정

Env 설명
DW_UUID
type: string
required: Y
Dataway UUID. Dataway를 생성할 때 시스템 워크스페이스에서 생성됩니다.
DW_TOKEN
type: string
required: Y
일반적으로 시스템 워크스페이스의 데이터 업로드 Token입니다.
DW_SECRET_TOKEN
type: string
required: N
Sinker 기능을 활성화할 때 이 Token을 설정할 수 있습니다.
DW_ENABLE_INTERNAL_TOKEN
type: boolean
required: N
__internal__을 클라이언트 Token으로 허용합니다. 이 경우 기본적으로 시스템 워크스페이스의 Token을 사용합니다.
DW_ENABLE_EMPTY_TOKEN
type: boolean
required: N
Token 없이 데이터 업로드를 허용합니다. 이 경우 기본적으로 시스템 워크스페이스의 Token을 사용합니다.

Sinker 설정

Env 설명
DW_SECRET_TOKEN
type: string
required: N
Sinker 기능을 활성화할 때 이 Token을 설정할 수 있습니다.
DW_CASCADED
type: string
required: N
Dataway가 캐스케이드 방식인지 여부
DW_SINKER_ETCD_URLS
type: string
required: N
etcd 주소 목록, 쉼표(,)로 구분, 예: http://1.2.3.4:2379,http://1.2.3.4:2380
DW_SINKER_ETCD_DIAL_TIMEOUT
type: string
required: N
etcd 연결 시간 초과, 기본값 30s
DW_SINKER_ETCD_KEY_SPACE
type: string
required: N
Sinker 설정이 있는 etcd key 이름 (기본값 /dw_sinker)
DW_SINKER_ETCD_USERNAME
type: string
required: N
etcd 사용자 이름
DW_SINKER_ETCD_PASSWORD
type: string
required: N
etcd 비밀번호
DW_SINKER_FILE_PATH
type: file-path
required: N
로컬 파일을 통해 sinker 규칙 구성 지정
DW_SINKER_CACHE_BUCKETS
type: int
required: N
Version-1.12.0 Sinker 캐시 버킷 수 지정, 기본값 64
DW_SINKER_CACHE_RESERVED_CAPACITY
type: int
required: N
Version-1.12.0 Sinker 캐시 항목 수 상한 지정, 기본값 100w (1<<20)
DW_SINKER_CACHE_TTL
type: int
required: N
Version-1.12.0 Sinker 캐시 요소의 유지 시간 지정, 기본값 10m (10분)
DW_SINKER_CACHE_PREALLOC
type: bool
required: N
Version-1.12.0 캐시 메모리 사전 할당, 기본값 false
Warning

로컬 파일과 etcd 방식을 동시에 지정하면 로컬 파일의 Sinker 규칙이 우선 적용됩니다. 둘 다 지정하지 않으면 sinker 기능이 비활성화됩니다.

Prometheus 메트릭 노출

Env 설명
DW_PROM_URL
type: string
required: N
Prometheus 메트릭의 URL Path (기본값 /metrics)
DW_PROM_LISTEN
type: string
required: N
Prometheus 메트릭 노출 주소 (기본값 localhost:9090)
DW_PROM_DISABLED
type: boolean
required: N
Prometheus 메트릭 노출 비활성화
DW_PPROF_BIND
type: string
required: N
pprof 수신 주소; 기본적으로 비활성화되어 있으며, loopback 주소만 허용합니다. 예: localhost:6060

디스크 캐시 설정

Env 설명
DW_DISKCACHE_DIR
type: file-path
required: N
캐시 디렉터리 설정, 이 디렉터리는 일반적으로 외부 스토리지에 마운트됩니다.
DW_DISKCACHE_DISABLE
type: boolean
required: N
디스크 캐시 비활성화, 캐시를 비활성화하지 않으려면 이 환경 변수를 삭제하세요.
DW_DISKCACHE_CLEAN_INTERVAL
type: string
required: N
캐시 정리 간격, 기본값 1s
DW_DISKCACHE_EXPIRE_DURATION
type: string
required: N
캐시 만료 시간, 기본값 168h (7일)
DW_DISKCACHE_CAPACITY_MB
type: int
required: N
Version-1.6.0 사용 가능한 디스크 공간 크기 설정, 단위 MB, 기본값 20GB
DW_DISKCACHE_BATCH_SIZE_MB
type: int
required: N
Version-1.6.0 단일 디스크 캐시 파일 최대 크기 설정, 단위 MB, 기본값 64MB
DW_DISKCACHE_MAX_DATA_SIZE_MB
type: int
required: N
Version-1.6.0 단일 캐시 내용 (예: 단일 HTTP body) 최대 크기 설정, 단위 MB, 기본값 64MB. 이 크기를 초과하는 단일 데이터 패킷은 폐기됩니다.
Tips

DW_DISKCACHE_DISABLE을 설정하면 디스크 캐시를 비활성화할 수 있습니다.

성능 관련 설정

Version-1.6.0

Env 설명
DW_COPY_BUFFER_DROP_SIZE
type: int
required: N
지정된 크기 (바이트 단위)를 초과하는 단일 HTTP body buffer는 즉시 해제되어 메모리 소비를 방지합니다. 기본값 256KB

Dataway API 목록

진단 및 로컬 처리 인터페이스를 제외하고, 전달 유형 인터페이스는 각각의 token 검증 규칙에 따라 요청을 Kodo 또는 다음 홉 Dataway로 전달합니다. Langfuse 호환 인터페이스의 인증 동작은 아래 설명을 참조하세요.

GET /v1/ping

Version-1.11.0

  • API 설명: Dataway의 현재 버전 번호 및 릴리스 날짜를 가져오고, 클라이언트 요청의 출구 IP를 반환합니다.

DataWay에서 404 페이지를 비활성화한 경우 (disable_404page), 이 인터페이스는 서비스를 제공할 수 없습니다.

GET /v1/ntp

Version-1.6.0

  • API 설명: Dataway의 현재 Unix 타임스탬프 (초 단위)를 가져옵니다.

POST /v1/write/:category

  • API 설명: Datakit이 업로드하는 다양한 수집 데이터를 수신합니다.

POST /v1/aggregate

  • API 설명: 메트릭 집계 데이터를 수신합니다. 집계 기능이 성공적으로 초기화된 경우에만 등록됩니다.
  • 자세한 작업 모드, 구성 및 요청 요구 사항은 Dataway 메트릭 집계를 참조하세요.

POST /v1/tail_samplingPOST /v1/tail_sampling_v2POST /v1/tail_sampling_config

  • API 설명: 각각 테일 샘플링 데이터 패킷과 테일 샘플링 구성을 수신합니다. 테일 샘플링 기능이 성공적으로 초기화된 경우에만 등록됩니다.
  • 자세한 작업 모드, 구성 및 요청 요구 사항은 Dataway 테일 샘플링을 참조하세요.

POST /otel/v1/{traces,metrics,logs}

Version-1.17.0

  • API 설명: OpenTelemetry OTLP HTTP/protobuf 데이터를 수신하고 Kodo의 해당 경로로 그대로 전달합니다.
  • 지원 경로:
    • POST /otel/v1/traces
    • POST /otel/v1/metrics
    • POST /otel/v1/logs
  • 요청 요구 사항:

    • Content-Type은 반드시 application/x-protobuf여야 하며, 미디어 타입 매개변수 (예: application/x-protobuf; charset=utf-8)를 포함할 수 있습니다.
    • 공간 token은 token query, X-Token header 또는 Authorization: Bearer <token>을 통해 전달할 수 있습니다. Bearer token은 전달 전에 X-Token으로 변환됩니다.
    • OpenTelemetry SDK/Agent 환경 변수를 사용하는 경우 OTLP HTTP/protobuf를 명시적으로 구성하고 기본 endpoint를 Dataway의 /otel 접두사로 설정하는 것이 좋습니다. OpenTelemetry는 신호에 따라 자동으로 /v1/traces, /v1/metrics/v1/logs를 추가합니다:
    export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
    export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://dataway.example.com/otel/v1/logs
    export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://dataway.example.com/otel/v1/traces
    export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=https://dataway.example.com/otel/v1/metrics
    export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20{token}"
    
    • 시작 매개변수는 환경 변수와 의미가 동일합니다. Java Agent의 예를 들면, -Dotel.exporter.otlp.protocol=http/protobuf, -Dotel.exporter.otlp.endpoint=https://dataway.example.com/otel-Dotel.exporter.otlp.headers=Authorization=Bearer%20{token}를 구성할 수 있습니다. Authorization header의 공백 인코딩 호환성 문제가 있는 경우 OTEL_EXPORTER_OTLP_HEADERS="X-Token={token}" 또는 해당 시작 매개변수를 사용할 수도 있습니다.
    • Dataway는 OTLP body를 구문 분석하거나 다시 작성하지 않습니다. /otel/v1/metrics/v1/write/metric line protocol로 변환되지 않습니다. Kodo는 DataKit 기본 OTLP 메트릭 규칙에 따라 구문 분석하며, measurement는 otel_service이고 메트릭 필드 이름은 OTLP 원본 메트릭 이름을 유지합니다 (예: runtime.jvm.memoryruntime_jvm_memory로 변경되지 않음).
    • Kodo에서 반환된 원본 OTLP 응답 상태, 응답 body 및 필요한 응답 header는 투과적으로 전달됩니다. 전달이 실패하고 디스크 캐시 정책이 충족되면 요청은 Dataway 디스크 캐시 재생 링크로 들어갑니다.

GET /v1/datakit/pull

  • API 설명: Datakit의 중앙 구성 (블랙리스트/Pipeline) 가져오기 요청을 처리합니다.

POST /v1/datakit/usage_trace

  • API 설명: Datakit 사용량 추적 데이터를 수신합니다.

POST /v1/write/rum/replay

  • API 설명: Datakit이 업로드하는 Session Replay 데이터를 수신합니다.

POST /v1/write/rum/replay_assets

  • API 설명: Session Replay 관련 리소스 업로드 요청을 수신합니다.

POST /v1/check/rum/replay_assets

  • API 설명: Session Replay 관련 리소스가 이미 존재하는지 확인합니다.

POST /v1/upload/profiling

  • API 설명: Datakit이 업로드하는 프로파일링 데이터를 수신합니다.

POST /v1/input/firehose

  • API 설명: Firehose 입력 데이터를 수신합니다.

POST /v1/election

  • API 설명: Datakit의 선출 요청을 처리합니다.

POST /v1/election/heartbeat

  • API 설명: Datakit의 선출 하트비트 요청을 처리합니다.

POST /v1/query/raw

DQL 쿼리 요청을 처리합니다. 간단한 예시는 다음과 같습니다:

POST /v1/query/raw?token=<workspace-token> HTTP/1.1
Content-Type: application/json

{
    "token": "workspace-token",
    "queries": [
        {
            "query": "M::cpu LIMIT 1"
        }
    ],
    "echo_explain": <true/false>
}

반환 예시:

{
  "content": [
    {
      "series": [
        {
          "name": "cpu",
          "columns": [
            "time",
            "usage_iowait",
            "usage_total",
            "usage_user",
            "usage_guest",
            "usage_system",
            "usage_steal",
            "usage_guest_nice",
            "usage_irq",
            "load5s",
            "usage_idle",
            "usage_nice",
            "usage_softirq",
            "global_tag1",
            "global_tag2",
            "host",
            "cpu"
          ],
          "values": [
            [
              1709782208662,
              0,
              7.421875,
              3.359375,
              0,
              4.0625,
              0,
              0,
              0,
              1,
              92.578125,
              0,
              0,
              null,
              null,
              "WIN-JCHUL92N9IP",
              "cpu-total"
            ]
          ]
        }
      ],
      "points": null,
      "cost": "24.558375ms",
      "is_running": false,
      "async_id": "",
      "query_parse": {
        "namespace": "metric",
        "sources": {
          "cpu": "exact"
        },
        "fields": {},
        "funcs": {}
      },
      "index_name": "",
      "index_store_type": "",
      "query_type": "guancedb",
      "complete": false,
      "index_names": "",
      "scan_completed": false,
      "scan_index": "",
      "next_cursor_time": -1,
      "sample": 1,
      "interval": 0,
      "window": 0
    }
  ]
}

반환 결과 설명:

  • 실제 데이터는 내부 계층의 series 필드에 있습니다.
  • name은 메저먼트 이름을 나타냅니다 (여기서는 CPU 메트릭을 쿼리합니다. 로그 데이터인 경우 이 필드는 없습니다).
  • columns는 반환된 결과 열 이름을 나타냅니다.
  • valuescolumns에 해당하는 열 결과입니다.

Info
  • URL 요청 매개변수의 token은 JSON body의 token과 다를 수 있습니다.前者는 쿼리 요청의 유효성을 검증하는 데 사용되고, 后者는 대상 데이터가 있는 워크스페이스를 결정하는 데 사용됩니다.
  • queries 필드에는 여러 쿼리를 포함할 수 있으며, 각 쿼리는 추가 필드를 가질 수 있습니다. 자세한 필드 목록은 여기를 참조하세요.

POST /v1/workspace

  • API 설명: Datakit 측에서 시작한 워크스페이스 조회 요청을 처리합니다.

GET /v1/env_variable

  • API 설명: 워크스페이스 환경 변수를 가져옵니다.

POST /v1/dataway/heartbeat

  • API 설명: Dataway 하트비트 보고 요청을 수신합니다.

POST /v1/object/labels

  • API 설명: 객체 Label 수정 요청을 처리합니다.

DELETE /v1/object/labels

  • API 설명: 객체 Label 삭제 요청을 처리합니다.

GET /v1/check/token/:token

  • API 설명: token의 유효성을 검사합니다.

Langfuse 호환 인터페이스

다음 인터페이스는 Langfuse 클라이언트와의 호환을 위한 것입니다. 요청은 직접 상위로 전달되며, Dataway는 token 검증을 수행하지 않습니다:

  • POST /api/public/otel/v1/traces: Langfuse OTLP Trace 데이터를 수신합니다.
  • GET /api/public/projects: Langfuse 프로젝트 정보를 가져옵니다.
  • POST /api/public/ingestion: Langfuse ingestion 데이터를 수신합니다.

Dataway 메트릭 수집

HTTP client 메트릭 수집

Dataway가 Kodo (또는 다음 홉 Dataway)를 HTTP 요청하는 메트릭을 수집하려면 수동으로 http_client_trace 구성을 활성화해야 합니다. 또는 환경 변수 DW_HTTP_CLIENT_TRACE=true를 지정하세요.

Dataway 자체는 Prometheus 메트릭을 노출합니다. Datakit에 내장된 prom 수집기를 사용하여 메트릭을 수집할 수 있습니다. 수집기 예시 구성은 다음과 같습니다:

[[inputs.prom]]
  ## Exporter URLs.
  urls = [ "http://localhost:9090/metrics", ]
  source = "dataway"
  election = true
  measurement_name = "dw" # dataway 메트릭 세트는 dw로 고정, 변경하지 마세요.
[inputs.prom.tags]
  service = "dataway"

클러스터에 Datakit이 배포되어 있는 경우 ( Datakit 1.14.2 이상 버전 필요), Dataway에서 Prometheus 메트릭 노출을 활성화할 수 있습니다 (Dataway 기본 POD yaml에는 이미 포함되어 있음):

annotations: # 다음 annotation은 기본적으로 추가되어 있습니다.
   datakit/prom.instances: |
     [[inputs.prom]]
       url = "http://$IP:9090/metrics" # 여기서 포트 (기본값 9090)는 상황에 따라 다릅니다.
       source = "dataway"
       measurement_name = "dw" # 이 메트릭 세트로 고정
       interval = "10s"
       disable_instance_tag = true

     [inputs.prom.tags]
       service = "dataway"
       instance = "$PODNAME"

...
env:
- name: DW_PROM_LISTEN
  value: "0.0.0.0:9090" # 여기서 포트는 위 url의 포트와 일치해야 합니다.

수집에 성공하면 Guance '시나리오'/'내장 뷰'에서 dataway를 검색하여 해당 모니터링 뷰를 볼 수 있습니다.

캐시 및 Kodo 큐 문제 해결

Kodo가 5xx를 반환하거나, Dataway가 Kodo 요청에 실패하거나, Kodo 발송 큐가 가득 차면 Dataway는 캐시 가능한 요청을 디스크 캐시에 쓰려고 시도합니다. Kodo 4xx는 캐시에 들어가지 않습니다.

문제 해결 시 다음 메트릭을 우선 확인할 수 있습니다:

  • dataway_http_api_cached_bytes{reason=...}: 요청이 캐시에 기록되었습니다. 일반적인 reason에는 Kodo 5xx 상태 텍스트, httpCliDoFailedkodoQueueFull이 포함됩니다.
  • dataway_http_api_dropped_cache{reason=...}: 요청이 캐시를 시도했지만 기록되지 않았습니다. 일반적인 reason에는 feat-disabled, expected-api-drop, body-md5-not-matched, body-length-not-matched, expired, put-failedsendopt-nil이 포함됩니다.
  • dataway_kodo_queue_full_total{action=...}: Kodo 큐가 가득 찬 후의 처리 결과입니다. action="cache"는 캐시로 전환되었음을 의미하고, action="reject"는 캐시를 사용할 수 없거나 쓰기 실패 후 503을 반환함을 의미합니다.

Dataway 메트릭 목록

다음은 Dataway가 노출하는 메트릭입니다. http://localhost:9090/metrics를 요청하여 이러한 메트릭을 가져올 수 있습니다. 다음 명령을 사용하여 특정 메트릭을 실시간으로 (3초 간격) 볼 수 있습니다:

일부 메트릭을 쿼리할 수 없는 경우 관련 비즈니스 모듈이 아직 실행되지 않았기 때문일 수 있습니다. 일부 새로운 메트릭은 최신 버전에만 존재합니다. 각 메트릭의 버전 정보는 여기서 일일이 표시하지 않으며, /metrics 인터페이스가 반환하는 메트릭 목록을 기준으로 합니다.

watch -n 3 'curl -s http://localhost:9090/metrics | grep -a <METRIC-NAME>'
TYPE NAME LABELS HELP
SUMMARY dataway_kodo_queue_wait_seconds api,method Kodo queue wait duration before worker dispatch
SUMMARY dataway_http_api_elapsed_seconds api,method,sinked,status API request latency
SUMMARY dataway_http_api_body_buffer_utilization api API body buffer utillization(Len/Cap)
SUMMARY dataway_http_api_body_copy api API body copy
SUMMARY dataway_http_api_body_copy_seconds api API body copy latency
SUMMARY dataway_http_api_body_copy_enlarge api API body copy enlarged pooled buffer
SUMMARY dataway_http_api_resp_size_bytes api,method,status API response size
SUMMARY dataway_http_api_req_size_bytes api,method,status API request size
COUNTER dataway_http_api_body_too_large_dropped_total api,method API request too large dropped
COUNTER dataway_http_api_with_inner_token api,method API request with inner token
COUNTER dataway_http_api_dropped_total api,method API request dropped when sinker rule match failed
COUNTER dataway_ip_blacklist_blocked_total api,method IP blacklist blocked requests total
COUNTER dataway_ip_blacklist_missed_total api,method IP blacklist missed total
COUNTER dataway_ip_blacklist_added_total api,method,reason IP blacklist added total
COUNTER dataway_syncpool_stats name,type sync.Pool usage stats
COUNTER dataway_http_api_copy_body_failed_total api API copy body failed count
COUNTER dataway_http_api_signed_total api,method API signature count
SUMMARY dataway_http_api_cached_bytes api,cache_type,method,reason API cached body bytes
SUMMARY dataway_http_api_reusable_body_read_bytes api,method API re-read body on forking request
SUMMARY dataway_http_api_recv_points api API /v1/write/:category recevied points
SUMMARY dataway_http_api_send_points api API /v1/write/:category send points
SUMMARY dataway_http_api_cache_points api,cache_type Disk cached /v1/write/:category points
SUMMARY dataway_http_api_cache_cleaned_points api,cache_type,status Disk cache cleaned /v1/write/:category points
COUNTER dataway_http_api_forked_total api,method,token API request forked total
GAUGE dataway_http_cli_info max_conn_per_host,max_idle_conn,max_idle_conn_per_host,timeout Dataway as client settings
GAUGE dataway_http_info cascaded,docker,http_client_trace,listen,max_body,release_date,remote,version Dataway API basic info
GAUGE dataway_kodo_queue_depth N/A Current Kodo dispatch queue depth including in-flight tasks
GAUGE dataway_kodo_queue_bytes N/A Current Kodo dispatch queue body bytes including in-flight tasks
COUNTER dataway_kodo_queue_enqueued_total api,method Kodo queue enqueued tasks
COUNTER dataway_kodo_queue_full_total api,method,action Kodo queue full events
COUNTER dataway_kodo_queue_dispatch_total api,method,status Kodo queue dispatch results
COUNTER dataway_token_negative_cache_added_total api,method,error_code Token negative cache added total
COUNTER dataway_token_negative_cache_blocked_total api,method,error_code Token negative cache blocked requests total
GAUGE dataway_last_heartbeat_time N/A Dataway last heartbeat with Kodo timestamp
SUMMARY dataway_http_api_copy_buffer_drop_total max API copy buffer dropped(too large cached buffer) count
GAUGE dataway_cpu_usage N/A Dataway CPU usage(%)
GAUGE dataway_mem_stat type Dataway memory usage stats
GAUGE dataway_open_files N/A Dataway open files
GAUGE dataway_open_files_by_type type Dataway open files grouped by fd type
GAUGE dataway_tcp_connections direction,port,state Dataway TCP connections grouped by direction, port and state(Linux only)
GAUGE dataway_cpu_cores N/A Dataway CPU cores
GAUGE dataway_uptime N/A Dataway uptime
COUNTER dataway_process_ctx_switch_total type Dataway process context switch count(Linux only)
COUNTER dataway_process_io_count_total type Dataway process IO count
COUNTER dataway_process_io_bytes_total type Dataway process IO bytes count
SUMMARY dataway_http_api_dropped_cache api,method,reason Dropped cache data dur to various reasons
COUNTER dataway_http_api_body_size_bytes_total api,token Accumulated API body bytes for aggregate or tailSampling
COUNTER dataway_http_aggr_point_total api,token point count of aggregate or tailSampling
COUNTER dataway_http_tail_sampling_trace_total token tailSampling trace count
COUNTER dataway_http_tail_sampling_span_total token tailSampling span count
COUNTER dataway_http_tail_sampling_packet_send_total token,data_type,result tailSampling packet send result count
GAUGE dataway_httpcli_dns_resolved_address api,coalesced,host,server HTTP DNS resolved address
SUMMARY dataway_httpcli_dns_cost_seconds api,coalesced,host,server HTTP DNS cost
SUMMARY dataway_httpcli_tls_handshake_seconds api,server HTTP TLS handshake cost
SUMMARY dataway_httpcli_http_connect_cost_seconds api,server HTTP connect cost
SUMMARY dataway_httpcli_got_first_resp_byte_cost_seconds api,server Got first response byte cost
SUMMARY http_latency api,server HTTP latency
COUNTER dataway_httpcli_tcp_conn_total api,server,remote,type HTTP TCP connection count
COUNTER dataway_httpcli_conn_reused_from_idle_total api,server HTTP connection reused from idle count
SUMMARY dataway_httpcli_conn_idle_time_seconds api,server HTTP connection idle time
GAUGE dataway_sinker_rule_cache_size name Sinker rule cache size
GAUGE dataway_sinker_rule_error error Rule errors
GAUGE dataway_sinker_default_rule_hit info Default sinker rule hit count
GAUGE dataway_sinker_rule_last_applied_time source,version Rule last applied time(Unix timestamp)
SUMMARY dataway_sinker_rule_cost_seconds type Rule cost time seconds
SUMMARY dataway_sinker_lru_cache_cleaned name Sinker LRU cache cleanup removed entries
COUNTER dataway_sinker_lru_cache_dropped_total bucket,name,reason Sinker LRU cache evicted entries total
HISTOGRAM dataway_sinker_lru_cache_expired_delay_seconds bucket,name Sinker LRU cache expired entry cleanup delay
HISTOGRAM dataway_sinker_lru_cache_evicted_remaining_ttl_seconds bucket,name Sinker LRU cache capacity evicted entry remaining TTL
COUNTER dataway_sinker_pull_total event,source Sinker pulled or pushed total
GAUGE dataway_sinker_rule_count type,with_default Sinker rule count
GAUGE dataway_sinker_rule_cache_get_total name,type Sinker rule cache get hit/miss count
COUNTER diskcache_rotate_total path Cache rotate count, mean file rotate from data to data.0000xxx
COUNTER diskcache_remove_total path Removed file count, if some file read EOF, remove it from un-read list
COUNTER diskcache_wakeup_total path Wakeup count on sleeping write file
COUNTER diskcache_pos_updated_total op,path .pos file updated count
COUNTER diskcache_seek_back_total path Seek back when Get() got any error
GAUGE diskcache_capacity path Current capacity(in bytes)
GAUGE diskcache_max_data path Max data to Put(in bytes), default 0
GAUGE diskcache_batch_size path Data file size(in bytes)
GAUGE diskcache_size path Current cache size that waiting to be consumed(get). The size include header bytes
GAUGE diskcache_open_time no_fallback_on_error,no_lock,no_pos,no_sync,path Current cache Open time in unix timestamp(second)
GAUGE diskcache_last_close_time path Current cache last Close time in unix timestamp(second)
GAUGE diskcache_datafiles path Current un-read data files
HISTOGRAM diskcache_lock_wait_seconds lock_type,path Time spent waiting for locks by lock type
COUNTER diskcache_lock_contention_total lock_type,path Number of lock contention events
SUMMARY diskcache_get_latency path Get() cost seconds
SUMMARY diskcache_put_latency path Put() cost seconds
SUMMARY diskcache_put_bytes path Cache Put() bytes
SUMMARY diskcache_get_bytes path Cache Get() bytes
SUMMARY diskcache_dropped_data path,reason Dropped data during Put() when capacity reached.

Docker 모드에서의 메트릭 수집

호스트 설치는 호스트 머신에 직접 설치하는 방식과 Docker를 통해 설치하는 방식 두 가지가 있습니다. 여기서는 Docker를 통해 설치할 때 메트릭 수집의 차이점에 대해 별도로 설명합니다.

Docker를 통해 설치할 때 메트릭 노출 HTTP 포트는 호스트 머신의 19090 포트로 매핑됩니다 (기본 설정). 이 경우 메트릭 수집 주소는 http://localhost:19090/metrics입니다.

다른 포트를 별도로 지정한 경우 Docker 설치 시 해당 포트에 10000을 더한 포트가 사용되므로, 여기서 지정하는 포트는 45535를 초과하지 않도록 해야 합니다.

pprof는 기본적으로 비활성화되어 있으며, Docker 설치 시에도 호스트 머신에 프로필 포트가 게시되지 않습니다. 임시 문제 해결 시 pprof_bind 또는 DW_PPROF_BINDlocalhost:6060으로 명시적으로 설정하고 docker exec, kubectl exec 또는 제어된 포트 포워딩을 통해 수집할 수 있습니다. 루프백이 아닌 주소를 구성하면 거부됩니다.

Dataway 자체 로그 수집 및 처리

Dataway 자체 로그는 gin 로그와 자체 프로그램 로그의 두 가지 유형으로 나뉩니다. 다음 Pipeline을 사용하여 이를 분리할 수 있습니다:

# Pipeline for dataway logging

# Testing sample loggin
'''
2023-12-14T11:27:06.744+0800    DEBUG   apis    apis/api_upload_profile.go:272  save profile file to disk [ok] /v1/upload/profiling?token=****************a4e3db8481c345a94fe5a
[GIN] 2021/10/25 - 06:48:07 | 200 |   30.890624ms |  114.215.200.73 | POST     "/v1/write/logging?token=tkn_5c862a11111111111111111111111111"
'''

add_pattern("TOKEN", "tkn_\\w+")
add_pattern("GINTIME", "%{YEAR}/%{MONTHNUM}/%{MONTHDAY}%{SPACE}-%{SPACE}%{HOUR}:%{MINUTE}:%{SECOND}")
grok(_,"\\[GIN\\]%{SPACE}%{GINTIME:timestamp}%{SPACE}\\|%{SPACE}%{NUMBER:dataway_code}%{SPACE}\\|%{SPACE}%{NOTSPACE:cost_time}%{SPACE}\\|%{SPACE}%{NOTSPACE:client_ip}%{SPACE}\\|%{SPACE}%{NOTSPACE:method}%{SPACE}%{GREEDYDATA:http_url}")

# gin logging
if cost_time != nil {
  if http_url != nil  {
    grok(http_url, "%{TOKEN:token}")
    cover(token, [5, 15])
    replace(message, "tkn_\\w{0,5}\\w{6}", "****************$4")
    replace(http_url, "tkn_\\w{0,5}\\w{6}", "****************$4")
  }

  group_between(dataway_code, [200,299], "info", status)
  group_between(dataway_code, [300,399], "notice", status)
  group_between(dataway_code, [400,499], "warning", status)
  group_between(dataway_code, [500,599], "error", status)

  if sample(0.1) { # drop 90% debug log
    drop()
    exit()
  } else {
    set_tag(sample_rate, "0.1")
  }

  parse_duration(cost_time)
  duration_precision(cost_time, "ns", "ms")

  set_measurement('gin', true)
  set_tag(service,"dataway")
  exit()
}

# app logging
if cost_time == nil {
  grok(_,"%{TIMESTAMP_ISO8601:timestamp}%{SPACE}%{NOTSPACE:status}%{SPACE}%{NOTSPACE:module}%{SPACE}%{NOTSPACE:code}%{SPACE}%{GREEDYDATA:msg}")
  if level == nil {
    grok(message,"Error%{SPACE}%{DATA:errormsg}")
    if errormsg != nil {
      add_key(status,"error")
      drop_key(errormsg)
    }
  }
  lowercase(level)

  # if debug level enabled, drop most of them
  if status == 'debug' {
    if sample(0.1) { # drop 90% debug log
      drop()
      exit()
    } else {
      set_tag(sample_rate, "0.1")
    }
  }

  group_in(status, ["error", "panic", "dpanic", "fatal","err","fat"], "error", status) # mark them as 'error'

  if msg != nil {
    grok(msg, "%{TOKEN:token}")
    cover(token, [5, 15])
    replace(message, "tkn_\\w{0,5}\\w{6}", "****************$4")
    replace(msg, "tkn_\\w{0,5}\\w{6}", "****************$4")
  }

  set_measurement("dataway-log", true)
  set_tag(service,"dataway")
}

Dataway 버그 리포트

Dataway는 메트릭을 노출하며, 필요에 따라 임시로 프로파일링 수집 진입점을 활성화하여 문제 해결에 사용할 수 있습니다. pprof는 기본적으로 비활성화되어 있으며, 수집하기 전에 pprof_bind를 루프백 주소로 명시적으로 설정하고 수집이 완료된 후 다시 비활성화해야 합니다.

다음 정보 수집은 실제 구성된 포트와 주소를 기준으로 합니다.

dw-bug-report.sh
br_dir="dw-br-$(date +%s)"
mkdir -p $br_dir

echo "save bug report to ${br_dir}"

# 실제 상황에 따라 여기서 구성 수정
dw_ip="localhost" # dataway 메트릭/프로파일이 노출된 IP 주소
metric_port=9090  # 메트릭 노출 포트
profile_port=6060 # 먼저 localhost:6060 pprof 수신을 명시적으로 활성화해야 함
dw_yaml_conf="/usr/local/cloudcare/dataflux/dataway/dataway.yaml"
dw_dot_yaml_conf="/usr/local/cloudcare/dataflux/dataway/.dataway.yaml" # 컨테이너 설치 시 이 파일이 있음

# 런타임 메트릭 수집
curl -v "http://${dw_ip}:${metric_port}/metrics" -o $br_dir/metrics

# 프로파일링 정보 수집
curl -v "http://${dw_ip}:${profile_port}/debug/pprof/allocs" -o $br_dir/allocs
curl -v "http://${dw_ip}:${profile_port}/debug/pprof/heap" -o $br_dir/heap
curl -v "http://${dw_ip}:${profile_port}/debug/pprof/profile" -o $br_dir/profile # 이 명령은 약 30초 동안 실행됨

cp $dw_yaml_conf $br_dir/dataway.yaml.copy
cp $dw_dot_yaml_conf $br_dir/.dataway.yaml.copy

tar czvf ${br_dir}.tar.gz ${br_dir}
rm -rf ${br_dir}

스크립트 실행:

$ sh dw-bug-report.sh
...

실행이 완료되면 dw-br-1721188604.tar.gz와 같은 파일이 생성됩니다. 이 파일을 가져오면 됩니다.

FAQ

요청 본문 크기 문제

Version-1.3.7

Dataway는 요청 본문 크기에 대한 기본 설정이 있습니다 (기본값 64MB). 요청 본문이 너무 크면 클라이언트는 HTTP 413 오류 (Request Entity Too Large)를 수신합니다. 요청 본문이 합리적인 범위 내에 있다면 이 값을 적절히 늘릴 수 있습니다 (바이트 단위):

  • 환경 변수 DW_MAX_HTTP_BODY_BYTES 설정
  • dataway.yaml에서 max_http_body_bytes 설정

실행 중에 너무 큰 요청 패킷이 발생하면 메트릭과 로그 모두에 표시됩니다:

  • 메트릭 dataway_http_too_large_dropped_total은 폐기된 큰 요청 수를 노출합니다.
  • Dataway 로그 cat log | grep 'drop too large request'를 검색하면 로그에 HTTP 요청의 Header 세부 정보가 출력되어 클라이언트 상황을 더 잘 이해할 수 있습니다.
Warning

디스크 캐시 모듈에도 최대 데이터 블록 쓰기 제한이 있습니다 (기본값 64MB). 최대 요청 본문 구성을 늘리는 경우 이 구성 (ENV_DISKCACHE_MAX_DATA_SIZE)도 함께 조정하여 큰 요청이 디스크 캐시에 올바르게 기록될 수 있도록 해야 합니다.


  1. 이 제한은 Dataway 컨테이너/Pod 실행 시 시스템 제한으로 인해 약 20000개의 연결만 사용할 수 있도록 하기 위한 것입니다. 제한을 늘리면 Dataway 데이터 업로드 효율성에 영향을 미칩니다. Dataway 트래픽이 많을 때는 단일 Dataway의 CPU 수를 늘리거나 Dataway 인스턴스를 수평 확장하는 것을 고려할 수 있습니다. 

문서 평가

이 페이지가 도움이 되었나요?