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 이중 스택을 지원하는지 확인한 후 다음 구성을 모두 수정하십시오:
- 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.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에 업그레이드 가능한 버전이 있는 경우 버전 정보에 업그레이드 알림이 표시됩니다.
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를 요청할 때 최대 유휴 연결 수 설정 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가 적용되었는지 테스트할 수 있습니다:
성공하면 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 |
일반적으로 시스템 워크스페이스의 데이터 업로드 토큰 |
| 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을 설정하면 디스크 캐시를 비활성화할 수 있습니다.
성능 관련 설정¶
| Env | 설명 |
|---|---|
| DW_COPY_BUFFER_DROP_SIZE type: int required: N |
지정된 크기(바이트 단위)를 초과하는 단일 HTTP body 버퍼는 즉시 지워져 메모리 소비를 방지합니다. 기본값 256KB |
Dataway API 목록¶
진단 및 로컬 처리 인터페이스를 제외하고, 전달 클래스 인터페이스는 각각의 토큰 검증 규칙에 따라 요청을 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 /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}¶
- 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)를 포함할 수 있습니다.- 공간 토큰은
tokenquery,X-Tokenheader 또는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}을 구성할 수 있습니다. 구현체에서Authorizationheader의 공백 인코딩 호환성이 일관되지 않은 경우OTEL_EXPORTER_OTLP_HEADERS="X-Token={token}"또는 해당 시작 매개변수를 대신 사용할 수 있습니다. - Dataway는 OTLP body를 구문 분석하거나 다시 쓰지 않습니다.
/otel/v1/metrics는/v1/write/metricline 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 수집기를 통해 해당 지표를 수집할 수 있습니다. 수집기 예시 구성은 다음과 같습니다:
클러스터에 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 캐시에서 제거된 총 항목 수 |
| 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 주소로 명시적으로 설정하고 수집이 완료된 후 다시 비활성화해야 합니다.
다음 정보 수집은 실제로 구성된 포트와 주소를 기준으로 합니다.
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 인스턴스를 수평 확장하는 것을 고려할 수 있습니다. ↩