ログストリーミング:Datadog

Fastly のリアルタイムログストリーミング機能を、Datadog が読める形式でログを送信するように設定することができます。Datadog はクラウドベースの監視及び分析ソリューションで、スタック内のアプリケーション内部を確認し、結果を集計できます。

注意

Fastly ではサードパーティのサービスに関する直接のサポートは行っておりません。詳細については、Fastly のご利用規約をご覧ください。

前提条件

Fastly サービスのログエンドポイントとして Datadog を追加する前に以下が必要です。

  • Datadog アカウントの登録。 Datadog サイトでアカウントを作成できます。制限付きの無料プラン、またはアップグレードしてより多くの機能を利用することができます。Datadog の設定を登録する場所が米国または欧州である場合、Fastly でログエンドポイントを設定する際に使用するコマンドが異なります。

  • Datadog API キーを Datadog の設定ページから取得。 Datadog インターフェイスで Integrations -> APIs にアクセスすることで API キーを作成・取得できます。

    トークンページ

    この例ではキーが表示されていますdecafbaddeadbeef。お客様の API キーは、これとは異なります。このキーを忘れないようにメモしてください。

ログエンドポイントとして Datadog を追加する

Datadog アカウントを作成し、Datadog API キーを書き留めたら、以下の手順で Fastly サービスのログエンドポイントとして Datadog を追加します。

  1. リモートログストリーミングの設定に関するガイドをご確認ください。
  2. Datadog Create endpointボタンをクリックしてください。Create a Datadog endpoint ページが表示されます。
  3. Create a Datadog endpoint フィールドに以下のように記入します。
    • Name フィールドに分かりやすいエンドポイントの名前を入力します。
    • Placement セクションでは、生成される VCL にログコールが配置される場所を選択します。有効な値は Format Version Defaultwaf_debug (waf_debug_log)None です。詳細については、ログ配置の変更に関するガイドをご覧ください。
    • Log format フィールドに、Datadog に送信するデータを入力します。 この形式の使用方法については以下をご覧ください。
    • Region メニューから、ログの送信先の地域を選択します。
    • API key フィールドに、Datadog アカウントの API キーを入力します。
  4. Create ボタンをクリックすると、新しいログエンドポイントが作成されます。
  5. Activate ボタンをクリックして設定変更をデプロイします。

エンドポイントの作成とサービスへの変更が完了すると、数秒後にログが Datadog アカウントに表示されるようになります。これらのログは Datadog アカウント内のDatadog Log Explorerを介してアクセスできます。

JSON ログ形式の使用

Datadog は JSON 形式のログファイルを自動的に解析できます。カスタマイズされたログルールを必要としないため、JSON 形式が Datadog にデータを取り込む最も簡単な方法となっています。さらに、Datadog は servicedate など、予約済みフィールドを認識します。

注意

この例の JSON ログは、読み取りやすくフォーマットされています。正しく解析されるためには、改行とインデントの空白をすべて取り除いた上で Log format 欄に1行で入力する必要があります。

例えば、以下の JSON では、ログを送信した Fastly サービスの ID を service と設定していますが、人間可読形式の名前を使用したり fastly などの共通の名前のもとにすべてのログをグループ化することも可能です。

1{
2 "ddsource": "fastly",
3 "service": "%{req.service_id}V",
4 "date": "%{begin:%Y-%m-%dT%H:%M:%S%z}t",
5 "time_start": "%{begin:%Y-%m-%dT%H:%M:%S%Z}t",
6 "time_end": "%{end:%Y-%m-%dT%H:%M:%S%Z}t",
7 "http": {
8 "request_time_ms": %D,
9 "method": "%m",
10 "url": "%{json.escape(req.url)}V",
11 "useragent": "%{User-Agent}i",
12 "referer": "%{Referer}i",
13 "protocol": "%H",
14 "request_x_forwarded_for": "%{X-Forwarded-For}i",
15 "status_code": "%s"
16 },
17 "network": {
18 "client": {
19 "ip": "%h",
20 "name": "%{client.as.name}V",
21 "number": "%{client.as.number}V",
22 "connection_speed": "%{client.geo.conn_speed}V"
23 },
24 "destination": {
25 "ip": "%A"
26 },
27 "geoip": {
28 "geo_city": "%{client.geo.city.utf8}V",
29 "geo_country_code": "%{client.geo.country_code}V",
30 "geo_continent_code": "%{client.geo.continent_code}V",
31 "geo_region": "%{client.geo.region}V"
32 },
33 "bytes_written": %B,
34 "bytes_read": %{req.body_bytes_read}V
35 },
36 "host":"%{if(req.http.Fastly-Orig-Host, req.http.Fastly-Orig-Host, req.http.Host)}V",
37 "origin_host": "%v",
38 "is_ipv6": %{if(req.is_ipv6, "true", "false")}V,
39 "is_tls": %{if(req.is_ssl, "true", "false")}V,
40 "tls_client_protocol": "%{json.escape(tls.client.protocol)}V",
41 "tls_client_servername": "%{json.escape(tls.client.servername)}V",
42 "tls_client_cipher": "%{json.escape(tls.client.cipher)}V",
43 "tls_client_cipher_sha": "%{json.escape(tls.client.ciphers_sha)}V",
44 "tls_client_tlsexts_sha": "%{json.escape(tls.client.tlsexts_sha)}V",
45 "is_h2": %{if(fastly_info.is_h2, "true", "false")}V,
46 "is_h2_push": %{if(fastly_info.h2.is_push, "true", "false")}V,
47 "h2_stream_id": "%{fastly_info.h2.stream_id}V",
48 "request_accept_content": "%{Accept}i",
49 "request_accept_language": "%{Accept-Language}i",
50 "request_accept_encoding": "%{Accept-Encoding}i",
51 "request_accept_charset": "%{Accept-Charset}i",
52 "request_connection": "%{Connection}i",
53 "request_dnt": "%{DNT}i",
54 "request_forwarded": "%{Forwarded}i",
55 "request_via": "%{Via}i",
56 "request_cache_control": "%{Cache-Control}i",
57 "request_x_requested_with": "%{X-Requested-With}i",
58 "request_x_att_device_id": "%{X-ATT-Device-Id}i",
59 "content_type": "%{Content-Type}o",
60 "is_cacheable": %{if(fastly_info.state~"^(HIT|MISS)$", "true","false")}V,
61 "response_age": "%{Age}o",
62 "response_cache_control": "%{Cache-Control}o",
63 "response_expires": "%{Expires}o",
64 "response_last_modified": "%{Last-Modified}o",
65 "response_tsv": "%{TSV}o",
66 "server_datacenter": "%{server.datacenter}V",
67 "req_header_size": %{req.header_bytes_read}V,
68 "resp_header_size": %{resp.header_bytes_written}V,
69 "socket_cwnd": %{client.socket.cwnd}V,
70 "socket_nexthop": "%{client.socket.nexthop}V",
71 "socket_tcpi_rcv_mss": %{client.socket.tcpi_rcv_mss}V,
72 "socket_tcpi_snd_mss": %{client.socket.tcpi_snd_mss}V,
73 "socket_tcpi_rtt": %{client.socket.tcpi_rtt}V,
74 "socket_tcpi_rttvar": %{client.socket.tcpi_rttvar}V,
75 "socket_tcpi_rcv_rtt": %{client.socket.tcpi_rcv_rtt}V,
76 "socket_tcpi_rcv_space": %{client.socket.tcpi_rcv_space}V,
77 "socket_tcpi_last_data_sent": %{client.socket.tcpi_last_data_sent}V,
78 "socket_tcpi_total_retrans": %{client.socket.tcpi_total_retrans}V,
79 "socket_tcpi_delta_retrans": %{client.socket.tcpi_delta_retrans}V,
80 "socket_ploss": %{client.socket.ploss}V
81}

翻訳についての注意事項
このガイドは役に立ちましたか?

このフォームを使用して機密性の高い情報を送信しないでください。サポートが必要な場合は、サポートチームまでご連絡ください