ログストリーミング:Datadog

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

注意

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

前提条件

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

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

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

    トークンページ

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

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

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

  1. サービス配信
  2. Compute サービス
  1. リモートログストリーミングの設定に関するガイドをご確認ください。
  2. Datadog エリアで、Create 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 オブジェクトとしてシリアル化されている必要があります。Datadog は JSON として作成されたログファイルを自動的に解析し、servicehostdate などの複数ある予約フィールドを認識することができます。

注意

この例の 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}

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

このフォームを使用して機密性の高い情報を送信しないでください。サポートが必要な場合は、サポートチームまでご連絡ください。このフォームは reCAPTCHA によって保護されており、Google のプライバシーポリシー利用規約が適用されます。