コンテンツにスキップ

Dataway


概要

DataWay は Guance のデータゲートウェイです。コレクターが Guance にデータを報告するには、すべて DataWay ゲートウェイを経由する必要があります。

Dataway のインストール

  • Dataway の新規作成

Guance 管理バックエンドの「データゲートウェイ」ページで、「Dataway を作成」をクリックします。名前とバインディングアドレスを入力し、「作成」をクリックします。

作成が成功すると、自動的に新しい Dataway が作成され、Dataway のインストールスクリプトが生成されます。

Info

バインディングアドレスは Dataway ゲートウェイアドレスです。完全な HTTP アドレス(例:http(s)://1.2.3.4:9528)を、プロトコル、ホストアドレス、ポートを含めて入力する必要があります。ホストアドレスは一般的に 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 は独立したリスナーを使用し、OS の 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 はデフォルトで無効。ループバックアドレスのみ許可します
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 を有効にする場合は、以下の 2 行のコメントを解除します
            # - 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 のコメントを解除します。

この 2 つは同時に有効にする必要があります。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 が完全に削除されます。

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
書き込み/アップロード/OTLP HTTP リクエストを Kodo または次の Dataway に送信する前に、有界ディスパッチキューを使用するかどうか。デフォルト true
DW_KODO_QUEUE_WORKERS
type: int
required: N
Kodo ディスパッチキューのワーカー数。デフォルト 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
無効なトークンのネガティブキャッシュが保持するスコープキーの最大数。デフォルト 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(秘密鍵ファイル)の 2 つのファイルが生成されます。秘密鍵ファイルは安全に保管し、その安全性を確保してください。

アプリケーションでこれらの TLS 証明書を使用するには、これら 2 つのファイルの絶対パスをアプリケーションの環境変数に設定する必要があります。以下は環境変数の設定例です:

最初に DW_ENABLE_TLS を有効にする必要があります。そうしないと、他の 2 つの 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 キー名(デフォルト /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 パス(デフォルト /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 リスニングアドレス。デフォルトでは無効。ループバックアドレスのみ受け入れます。例: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 ヘッダー、または Authorization: Bearer <token> で渡せます。Bearer トークンは転送前に X-Token に変換されます
    • OpenTelemetry SDK/Agent の環境変数を使用する場合、OTLP HTTP/protobuf を明示的に設定し、ベースエンドポイントを 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 ヘッダー内のスペースのエンコード互換性に問題がある場合は、OTEL_EXPORTER_OTLP_HEADERS="X-Token={token}" または対応する起動パラメータを使用することもできます。
    • Dataway は OTLP body を解析も書き換えもしません。/otel/v1/metrics は /v1/write/metric line protocol に変換されません。Kodo は DataKit デフォルトの OTLP metrics ルールに従って解析し、メジャーメントは otel_service、メトリクスフィールド名は OTLP の元のメトリクス名(例:runtime.jvm.memory は runtime_jvm_memory に書き換えられません)を保持します
    • Kodo から返される元の OTLP 応答ステータス、応答 body、および必要な応答ヘッダーは透過的に渡されます。転送に失敗し、ディスクキャッシュポリシーに該当する場合、リクエストは 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 説明:オブジェクトラベルの変更リクエストを処理します

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 クライアントメトリクス収集

Dataway が HTTP リクエストを Kodo(または次の Dataway)に送信する際のメトリクスを収集するには、手動で 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 モードでのメトリクス収集

ホストインストールには、ホストマシンへの直接インストールと Docker を使用したインストールの 2 つのモードがあります。ここでは 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 ログと自身のプログラムログの 2 種類に分類されます。以下の 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 はメトリクスを公開し、必要に応じて profiling 収集エントリを一時的に有効にして問題を調査できます。pprof はデフォルトで無効です。収集前に pprof_bind を明示的にループバックアドレスに設定し、収集完了後は再度無効にしてください。

以下の情報収集は、実際に設定されたポートとアドレスに基づきます。

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

echo "save bug report to ${br_dir}"

# 実際の状況に応じて、ここでの設定を変更してください
dw_ip="localhost" # dataway メトリクス/profile 公開 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

# profiling 情報を収集
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 リクエストのヘッダー詳細が出力され、クライアントの状況をさらに把握できます
Warning

ディスクキャッシュモジュールにも、最大データブロック書き込み制限があります(デフォルト 64MB)。最大リクエストボディ設定を増やす場合は、この設定(ENV_DISKCACHE_MAX_DATA_SIZE)も併せて調整し、大きなリクエストがディスクキャッシュに正しく書き込まれるようにしてください。


  1. この制限は、Dataway コンテナ/Pod の実行時にシステム制限により約 20000 接続しか使用できないことを避けるためのものです。制限を増やすと、Dataway のデータアップロード効率に影響します。Dataway のトラフィックが多い場合は、個々の Dataway の CPU 数を増やすか、Dataway インスタンスを水平スケーリングすることを検討してください。 ↩

フィードバック

このページは役に立ちましたか?