APISIX
インストール設定¶
前提条件¶
-
APISIXをインストール - DataKit をインストール
APISIX の設定¶
APISIX の設定ファイルは config.yaml です。datakit_host を実際のアドレスに変更してください。ホスト環境では IP を指定し、Kubernetes 環境では datakit-service.datakit.svc に変更します。
メトリクス¶
APISIX は Prometheus プロトコルでメトリクスを公開できます。APISIX の設定ファイルに次の設定を追加してください。
apisix:
prometheus:
enabled: true
path: /apisix/prometheus/metrics
metricPrefix: apisix_
containerPort: 9091
plugins:
- prometheus
あわせて、APISIX のグローバルプラグインで prometheus プラグインを有効化してください。
ログ¶
APISIX は複数の方法でログを送信できます。ここでは主に http-logger プラグインで送信します。
あわせて、APISIX のルートに http-logger の送信先アドレスを設定してください。内容は次のとおりです。
{
"batch_max_size": 1,
"uri": "http://<datakit_host>:9529/v1/write/logstreaming?source=apisix_logstreaming"
}
トレース¶
APISIX は Opentelemetry プロトコルでトレース情報を送信できます。opentelemetry プラグインを有効にして送信します。
apisix:
plugins:
- opentelemetry
pluginAttrs:
opentelemetry:
resource:
service.name: APISIX
tenant.id: business_id
collector:
address: <datakit_host>:9529/otel
request_timeout: 3
DataKit¶
ホスト¶
DataKit をホスト上で実行している場合は、ホスト方式でデータを収集できます。DataKit のインストールディレクトリに入って設定します。
- メトリクス
prometheus 収集器を有効にして APISIX のメトリクスを収集します。DataKit インストールディレクトリ 配下の conf.d/samples に移動し、次のコマンドを実行します。
cp prom.conf.sample apisix.conf
apisix.conf の内容を調整します。主に urls を変更します。次のとおりです。
- ログ
logstreaming 収集器を有効にして APISIX のログを収集します。DataKit インストールディレクトリ 配下の conf.d/log に移動し、次のコマンドを実行します。
cp logstreaming.conf.sample logstreaming.conf
内容の調整は不要です。
- トレース
opentelemetry 収集器を有効にして APISIX のトレースデータを収集します。DataKit インストールディレクトリ 配下の conf.d/opentelemetry に移動し、次のコマンドを実行します。
cp opentelemetry.conf.sample opentelemetry.conf
内容の調整は不要です。
- 再起動
調整が完了したら、Datakit を再起動します。
Kubernetes¶
DataKit を Kubernetes 上で実行している場合は、次の方法で設定できます。
- メトリクス
KubernetesPrometheus 収集器で Prometheus のメトリクス情報を収集できます。
datakit.yaml を編集し、ConfigMap に apisix.conf セクションを追加します。
apiVersion: v1
kind: ConfigMap
metadata:
name: datakit-conf
namespace: datakit
data:
apisix.conf: |-
[inputs.kubernetesprometheus]
node_local = true
scrape_interval = "30s"
keep_exist_metric_name = false
[[inputs.kubernetesprometheus.instances]]
role = "pod"
namespaces = ["apisix"]
selector = "app.kubernetes.io/name=apisix"
scrape = "true"
scheme = "http"
port = "9091"
path = "/apisix/prometheus/metrics"
interval = "30s"
[inputs.kubernetesprometheus.instances.custom]
measurement = "apisix"
job_as_measurement = false
[inputs.kubernetesprometheus.instances.custom.tags]
node_name = "__kubernetes_pod_node_name"
namespace = "__kubernetes_pod_namespace"
pod_name = "__kubernetes_pod_name"
instance = "__kubernetes_mate_instance"
host = "__kubernetes_mate_host"
続いて、apisix.conf を DataKit の /usr/local/datakit/conf.d/kubernetesprometheus/ ディレクトリにマウントします。
- mountPath: /usr/local/datakit/conf.d/kubernetesprometheus/apisix.conf
name: datakit-conf
subPath: apisix.conf
- ログ
datakit.yaml を編集し、ENV_DEFAULT_ENABLED_INPUTS 環境変数の値に logstreaming を追加します。次のとおりです。
- name: ENV_DEFAULT_ENABLED_INPUTS
value: dk,cpu,disk,diskio,mem,swap,system,hostobject,net,host_processes,container,statsd,logstreaming
- トレース
datakit.yaml を編集し、ENV_DEFAULT_ENABLED_INPUTS 環境変数の値に opentelemetry を追加します。同時に、OTEL と DDTrace のデータ互換を有効にするため ENV_INPUT_DDTRACE_COMPATIBLE_OTEL を有効化します。
- name: ENV_DEFAULT_ENABLED_INPUTS
value: dk,cpu,disk,diskio,mem,swap,system,hostobject,net,host_processes,container,statsd,logstreaming,opentelemetry
- name: ENV_INPUT_DDTRACE_COMPATIBLE_OTEL
value: 'true'
- 再起動
調整が完了したら、Datakit を再起動します。
メトリクス¶
| メトリクス | 説明 | 型 |
|---|---|---|
| bandwidth | APISIX のトラフィック(ingress/egress) | int |
| etcd_modify_indexes | etcd のインデックス記録数 | int |
| etcd_reachable | etcd の到達可否。1 は到達可能、0 は到達不可 | int |
| http_latency_bucket | サービスのリクエスト遅延時間 | int |
| http_latency_count | サービスのリクエスト遅延件数 | int |
| http_latency_sum | サービスのリクエスト遅延合計 | int |
| http_requests_total | http リクエスト総数 | int |
| http_status | http ステータス | int |
| nginx_http_current_connections | 現在の nginx 接続数 | int |
| nginx_metric_errors_total | nginx のメトリクスエラー数 | int |
| node_info | ノード情報 | int |
| shared_dict_capacity_bytes | APISIX nginx の容量 | int |
| shared_dict_free_space_bytes | APISIX nginx の空き容量 | int |
ログ¶
Pipeline を使って APISIX ログ内の trace_id を抽出し、トレースとログを関連付けます。
jsonData=load_json(_)
requestJson = jsonData["request"]
responseJson = jsonData["response"]
add_key(http_status,responseJson["status"])
add_key(url,requestJson["url"])
add_key(client_ip,jsonData["client_ip"])
trace_id = requestJson["headers"]["traceparent"]
grok(trace_id, "%{DATA}-%{DATA:trace_id}-%{DATA}")