콘텐츠로 이동

Dataway


소개

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

Dataway 설치

  • Dataway 생성

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

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

Info

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

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

  • 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는 별도의 리스너를 사용하여 운영 체제의 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, 복사 버퍼 메모리가 이보다 크면 메모리 해제
reserved_pool_size: 4096        # 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.19.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의 ipFamilyPolicy를 SingleStack에서 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.19.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 업그레이드

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

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

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

- image: pubrepo.guance.com/dataflux/dataway:1.19.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를 요청할 때 최대 유휴 연결 수 설정 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
Kodo 또는 다음 Dataway로 쓰기/업로드/OTLP HTTP 요청을 보내기 전에 유계 발송 큐를 활성화합니다. 기본값 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
유효하지 않은 토큰에 대한 부정 캐시 활성화 여부; 캐시는 토큰, 쓰기 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와 중앙 간의 heartbeat 간격, 기본값 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.crt 및 tls.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
일반적으로 시스템 워크스페이스의 데이터 업로드 토큰
DW_SECRET_TOKEN
type: string
required: N
Sinker 기능을 활성화할 때 이 토큰을 설정할 수 있습니다
DW_ENABLE_INTERNAL_TOKEN
type: boolean
required: N
__internal__을 클라이언트 토큰으로 허용하며, 이때 기본적으로 시스템 워크스페이스의 토큰을 사용합니다
DW_ENABLE_EMPTY_TOKEN
type: boolean
required: N
토큰 없이 데이터 업로드를 허용하며, 이때 기본적으로 시스템 워크스페이스의 토큰을 사용합니다

Sinker 설정

Env 설명
DW_SECRET_TOKEN
type: string
required: N
Sinker 기능을 활성화할 때 이 토큰을 설정할 수 있습니다
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 (7d)
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 버퍼는 즉시 지워져 메모리 소비를 방지합니다. 기본값 256KB

Dataway API 목록

진단 및 로컬 처리 인터페이스를 제외하고, 전달 클래스 인터페이스는 각각의 토큰 검증 규칙에 따라 요청을 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_sampling、POST /v1/tail_sampling_v2、POST /v2/tail_sampling 和 POST /v1/tail_sampling_config

  • API 설명: /v1/tail_sampling은 raw 테일 샘플링 데이터 패킷을 수신하며 Datakit 2.10에서 보내는 협상 헤더가 없는 zstd 데이터 패킷과 호환됩니다. 레거시 경로 /v1/tail_sampling_v2는 raw 데이터 패킷만 수신합니다. /v2/tail_sampling은 압축 협상 헤더가 있는 zstd 데이터 패킷을 수신합니다. /v1/tail_sampling_config는 테일 샘플링 구성을 수신합니다. 테일 샘플링 기능이 초기화에 성공한 경우에만 등록됩니다.
  • 자세한 작업 모드, 구성 및 요청 요구 사항은 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 query, X-Token header 또는 Authorization: Bearer <token>을 통해 전달할 수 있습니다. Bearer 토큰은 전달되기 전에 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 metrics 규칙에 따라 구문 분석하며, measurement는 otel_service이고, 지표 필드 이름은 OTLP 원래 지표 이름을 유지합니다(예: runtime.jvm.memory는 runtime_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의 선출 heartbeat 요청을 처리합니다

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는 반환된 결과 열 이름을 나타냅니다
  • values는 columns에 해당하는 열 결과입니다

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

POST /v1/workspace

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

GET /v1/env_variable

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

POST /v1/dataway/heartbeat

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

POST /v1/object/labels

  • API 설명: 객체 레이블 수정 요청을 처리합니다

DELETE /v1/object/labels

  • API 설명: 객체 레이블 삭제 요청을 처리합니다

GET /v1/check/token/:token

  • API 설명: 토큰이 유효한지 확인합니다.

Langfuse 호환 인터페이스

다음 인터페이스는 Langfuse 클라이언트와의 호환성을 위해 사용되며, 요청은 직접 상위로 전달되고 Dataway는 토큰 검증을 수행하지 않습니다:

  • 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 상태 텍스트, httpCliDoFailed 및 kodoQueueFull이 포함됩니다.
  • dataway_http_api_dropped_cache{reason=...}: 요청이 캐시를 시도했지만 기록되지 않았습니다. 일반적인 reason에는 feat-disabled, expected-api-drop, body-md5-not-matched, body-length-not-matched, expired, put-failed 및 sendopt-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 캐시에서 제거된 총 항목 수
HISTOGRAM dataway_sinker_lru_cache_expired_delay_seconds bucket,name Sinker LRU 캐시 만료 항목 정리 지연 시간
HISTOGRAM dataway_sinker_lru_cache_evicted_remaining_ttl_seconds bucket,name Sinker LRU 캐시 용량 제거 항목의 남은 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 모드에서의 지표 수집

호스트 설치는 두 가지 모드가 있습니다. 하나는 호스트 OS에 직접 설치하는 것이고, 다른 하나는 Docker를 통해 설치하는 것입니다. 여기서는 Docker를 통해 설치할 때의 지표 수집 차이점을 별도로 설명합니다.

Docker를 통해 설치하면 지표 노출 HTTP 포트가 호스트의 19090 포트(기본값)에 매핑됩니다. 이때 지표 수집 주소는 http://localhost:19090/metrics입니다.

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

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

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를 loopback 주소로 명시적으로 설정하고 수집이 완료된 후 다시 비활성화해야 합니다.

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

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 인스턴스를 수평 확장하는 것을 고려할 수 있습니다. ↩

문서 평가

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