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 듀얼 스택을 지원하는지 확인한 후 다음 구성을 모두 수정하세요:
- Dataway 컨테이너 환경 변수에서
DW_BIND_IPV6의 주석을 해제하고[::]:9528로 설정하여 Dataway가 IPv4와 IPv6를 모두 수신하도록 합니다. - 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에 마운트해야 합니다:
컨테이너 설치에 필요한 환경 변수는 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에 업그레이드 가능한 버전이 있는 경우 버전 정보에 업그레이드 알림이 표시됩니다.
Dataway 서비스 관리¶
호스트에 Dataway를 설치한 경우 다음 명령을 사용하여 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.crt 및 tls.key 파일이 있는 경로로 바꾸세요.
설정이 완료되면 다음 명령으로 TLS가 적용되었는지 테스트할 수 있습니다:
성공하면 It's working!이라는 ASCII Art 메시지가 표시됩니다. 인증서가 없으면 Dataway 로그에 다음과 유사한 오류가 표시됩니다:
이 경우 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을 설정하면 디스크 캐시를 비활성화할 수 있습니다.
성능 관련 설정¶
| Env | 설명 |
|---|---|
| DW_COPY_BUFFER_DROP_SIZE type: int required: N |
지정된 크기 (바이트 단위)를 초과하는 단일 HTTP body buffer는 즉시 해제되어 메모리 소비를 방지합니다. 기본값 256KB |
Dataway API 목록¶
진단 및 로컬 처리 인터페이스를 제외하고, 전달 유형 인터페이스는 각각의 token 검증 규칙에 따라 요청을 Kodo 또는 다음 홉 Dataway로 전달합니다. Langfuse 호환 인터페이스의 인증 동작은 아래 설명을 참조하세요.
GET /v1/ping¶
- API 설명: Dataway의 현재 버전 번호 및 릴리스 날짜를 가져오고, 클라이언트 요청의 출구 IP를 반환합니다.
DataWay에서 404 페이지를 비활성화한 경우 (
disable_404page), 이 인터페이스는 서비스를 제공할 수 없습니다.
GET /v1/ntp¶
- API 설명: Dataway의 현재 Unix 타임스탬프 (초 단위)를 가져옵니다.
POST /v1/write/:category¶
- API 설명: Datakit이 업로드하는 다양한 수집 데이터를 수신합니다.
POST /v1/aggregate¶
- API 설명: 메트릭 집계 데이터를 수신합니다. 집계 기능이 성공적으로 초기화된 경우에만 등록됩니다.
- 자세한 작업 모드, 구성 및 요청 요구 사항은 Dataway 메트릭 집계를 참조하세요.
POST /v1/tail_sampling、POST /v1/tail_sampling_v2 和 POST /v1/tail_sampling_config¶
- API 설명: 각각 테일 샘플링 데이터 패킷과 테일 샘플링 구성을 수신합니다. 테일 샘플링 기능이 성공적으로 초기화된 경우에만 등록됩니다.
- 자세한 작업 모드, 구성 및 요청 요구 사항은 Dataway 테일 샘플링을 참조하세요.
POST /otel/v1/{traces,metrics,logs}¶
- API 설명: OpenTelemetry OTLP HTTP/protobuf 데이터를 수신하고 Kodo의 해당 경로로 그대로 전달합니다.
- 지원 경로:
POST /otel/v1/tracesPOST /otel/v1/metricsPOST /otel/v1/logs
-
요청 요구 사항:
Content-Type은 반드시application/x-protobuf여야 하며, 미디어 타입 매개변수 (예:application/x-protobuf; charset=utf-8)를 포함할 수 있습니다.- 공간 token은
tokenquery,X-Tokenheader 또는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}를 구성할 수 있습니다.Authorizationheader의 공백 인코딩 호환성 문제가 있는 경우OTEL_EXPORTER_OTLP_HEADERS="X-Token={token}"또는 해당 시작 매개변수를 사용할 수도 있습니다. - Dataway는 OTLP body를 구문 분석하거나 다시 작성하지 않습니다.
/otel/v1/metrics는/v1/write/metricline protocol로 변환되지 않습니다. Kodo는 DataKit 기본 OTLP 메트릭 규칙에 따라 구문 분석하며, 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의 선출 하트비트 요청을 처리합니다.
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 하트비트 보고 요청을 수신합니다.
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 수집기를 사용하여 메트릭을 수집할 수 있습니다. 수집기 예시 구성은 다음과 같습니다:
클러스터에 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인터페이스가 반환하는 메트릭 목록을 기준으로 합니다.
| 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_BIND를 localhost: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를 루프백 주소로 명시적으로 설정하고 수집이 완료된 후 다시 비활성화해야 합니다.
다음 정보 수집은 실제 구성된 포트와 주소를 기준으로 합니다.
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}
스크립트 실행:
실행이 완료되면 dw-br-1721188604.tar.gz와 같은 파일이 생성됩니다. 이 파일을 가져오면 됩니다.
FAQ¶
요청 본문 크기 문제¶
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)도 함께 조정하여 큰 요청이 디스크 캐시에 올바르게 기록될 수 있도록 해야 합니다.
-
이 제한은 Dataway 컨테이너/Pod 실행 시 시스템 제한으로 인해 약 20000개의 연결만 사용할 수 있도록 하기 위한 것입니다. 제한을 늘리면 Dataway 데이터 업로드 효율성에 영향을 미칩니다. Dataway 트래픽이 많을 때는 단일 Dataway의 CPU 수를 늘리거나 Dataway 인스턴스를 수평 확장하는 것을 고려할 수 있습니다. ↩